Merge lp:~openerp-dev/openobject-addons/trunk-website-al into lp:openobject-addons

Proposed by Christophe Matthieu (OpenERP)
Status: Merged
Merged at revision: 9080
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-website-al
Merge into: lp:openobject-addons
Diff against target: 102849 lines (+52650/-40609)
806 files modified
account/account_unit_test.xml (+1/-1)
account/account_view.xml (+1/-0)
account/product_view.xml (+18/-10)
account/res_config_view.xml (+2/-2)
account_anglo_saxon/product_view.xml (+4/-4)
auth_oauth/__openerp__.py (+4/-8)
auth_oauth/auth_oauth_data.xml (+3/-3)
auth_oauth/controllers/main.py (+58/-19)
auth_oauth/res_users.py (+2/-2)
auth_oauth/res_users.xml (+1/-1)
auth_oauth/static/lib/zocial/README.md (+0/-31)
auth_oauth/static/lib/zocial/css/zocial-regular-webfont.svg (+0/-129)
auth_oauth/static/lib/zocial/css/zocial.css (+0/-420)
auth_oauth/static/lib/zocial/sample.html (+0/-265)
auth_oauth/static/src/css/auth_oauth.css (+0/-34)
auth_oauth/static/src/js/auth_oauth.js (+0/-80)
auth_oauth/static/src/xml/auth_oauth.xml (+0/-8)
auth_oauth/views/auth_oauth_login.xml (+19/-0)
auth_oauth_signup/__init__.py (+1/-0)
auth_oauth_signup/__openerp__.py (+1/-1)
auth_oauth_signup/controllers/__init__.py (+3/-0)
auth_oauth_signup/controllers/main.py (+20/-0)
auth_oauth_signup/static/src/js/auth_oauth_signup.js (+0/-14)
auth_openid/controllers/main.py (+1/-2)
auth_openid/static/src/js/auth_openid.js (+2/-0)
auth_signup/__openerp__.py (+2/-1)
auth_signup/auth_signup_data.xml (+1/-1)
auth_signup/controllers/main.py (+67/-54)
auth_signup/res_config.xml (+1/-1)
auth_signup/res_users.py (+10/-11)
auth_signup/static/src/js/auth_signup.js (+15/-182)
auth_signup/static/src/xml/auth_signup.xml (+0/-39)
auth_signup/views/auth_signup_login.xml (+91/-0)
base_geolocalize/__init__.py (+22/-0)
base_geolocalize/__openerp__.py (+44/-0)
base_geolocalize/models/__init__.py (+1/-0)
base_geolocalize/models/res_partner.py (+88/-0)
base_geolocalize/views/res_partner_view.xml (+30/-0)
base_import/__openerp__.py (+0/-2)
base_import/static/lib/select2/LICENSE (+0/-12)
base_import/static/lib/select2/README.md (+0/-68)
base_import/static/lib/select2/release.sh (+0/-77)
base_import/static/lib/select2/select2.css (+0/-524)
base_import/static/lib/select2/select2.js (+0/-2407)
base_setup/res_config.py (+0/-2)
base_setup/res_config_view.xml (+1/-10)
crm/crm_lead_menu.xml (+2/-2)
crm/wizard/crm_lead_to_opportunity.py (+0/-1)
crm_partner_assign/__openerp__.py (+6/-3)
crm_partner_assign/crm_partner_assign.py (+11/-56)
crm_partner_assign/portal_data.xml (+3/-18)
crm_partner_assign/res_partner_demo.xml (+100/-4)
crm_partner_assign/res_partner_view.xml (+6/-5)
crm_partner_assign/security/ir.model.access.csv (+1/-1)
crm_partner_assign/wizard/crm_forward_to_partner.py (+1/-1)
decimal_precision/decimal_precision.py (+27/-2)
decimal_precision/security/ir.model.access.csv (+1/-0)
decimal_precision/tests/__init__.py (+6/-0)
decimal_precision/tests/test_qweb_float.py (+66/-0)
delivery/__openerp__.py (+1/-1)
delivery/delivery.py (+5/-6)
delivery/delivery_demo.xml (+3/-1)
delivery/sale.py (+33/-16)
document_page/__init__.py (+0/-25)
document_page/__openerp__.py (+0/-48)
document_page/i18n/ar.po (+0/-255)
document_page/i18n/bg.po (+0/-254)
document_page/i18n/bs.po (+0/-254)
document_page/i18n/ca.po (+0/-255)
document_page/i18n/cs.po (+0/-255)
document_page/i18n/da.po (+0/-255)
document_page/i18n/de.po (+0/-255)
document_page/i18n/document_page.pot (+0/-253)
document_page/i18n/el.po (+0/-257)
document_page/i18n/es.po (+0/-257)
document_page/i18n/es_AR.po (+0/-494)
document_page/i18n/es_CR.po (+0/-520)
document_page/i18n/es_MX.po (+0/-535)
document_page/i18n/es_VE.po (+0/-535)
document_page/i18n/et.po (+0/-254)
document_page/i18n/fi.po (+0/-255)
document_page/i18n/fr.po (+0/-258)
document_page/i18n/gl.po (+0/-256)
document_page/i18n/hr.po (+0/-256)
document_page/i18n/hu.po (+0/-257)
document_page/i18n/id.po (+0/-254)
document_page/i18n/it.po (+0/-258)
document_page/i18n/ja.po (+0/-255)
document_page/i18n/ko.po (+0/-255)
document_page/i18n/lt.po (+0/-255)
document_page/i18n/lv.po (+0/-255)
document_page/i18n/mk.po (+0/-258)
document_page/i18n/mn.po (+0/-255)
document_page/i18n/nb.po (+0/-255)
document_page/i18n/nl.po (+0/-257)
document_page/i18n/nl_BE.po (+0/-440)
document_page/i18n/pl.po (+0/-256)
document_page/i18n/pt.po (+0/-254)
document_page/i18n/pt_BR.po (+0/-256)
document_page/i18n/ro.po (+0/-257)
document_page/i18n/ru.po (+0/-256)
document_page/i18n/sk.po (+0/-255)
document_page/i18n/sl.po (+0/-254)
document_page/i18n/sq.po (+0/-255)
document_page/i18n/sr.po (+0/-255)
document_page/i18n/sr@latin.po (+0/-255)
document_page/i18n/sv.po (+0/-254)
document_page/i18n/tlh.po (+0/-254)
document_page/i18n/tr.po (+0/-255)
document_page/i18n/uk.po (+0/-254)
document_page/i18n/vi.po (+0/-255)
document_page/i18n/zh_CN.po (+0/-254)
document_page/i18n/zh_TW.po (+0/-254)
document_page/security/document_page_security.xml (+0/-8)
document_page/static/src/css/document_page.css (+0/-12)
document_page/wizard/document_page_create_menu.py (+0/-86)
document_page/wizard/document_page_create_menu_view.xml (+0/-33)
edi/controllers/main.py (+2/-2)
edi/static/src/js/edi.js (+3/-12)
email_template/email_template.py (+1/-1)
email_template/tests/test_mail.py (+1/-1)
email_template/wizard/mail_compose_message.py (+14/-0)
event/__init__.py (+0/-2)
event/__openerp__.py (+8/-3)
event/event.py (+59/-105)
event/event_demo.xml (+170/-17)
event/event_view.xml (+42/-61)
event/report/report_event_registration.py (+3/-6)
event/test/process/event_draft2done.yml (+4/-4)
event_moodle/__init__.py (+0/-25)
event_moodle/__openerp__.py (+0/-77)
event_moodle/event_moodle.py (+0/-286)
event_moodle/event_view.xml (+0/-38)
event_moodle/i18n/cs.po (+0/-185)
event_moodle/i18n/de.po (+0/-198)
event_moodle/i18n/es.po (+0/-194)
event_moodle/i18n/event_moodle.pot (+0/-175)
event_moodle/i18n/fr.po (+0/-194)
event_moodle/i18n/hr.po (+0/-185)
event_moodle/i18n/hu.po (+0/-197)
event_moodle/i18n/mk.po (+0/-194)
event_moodle/i18n/mn.po (+0/-185)
event_moodle/i18n/nl.po (+0/-185)
event_moodle/i18n/pt.po (+0/-187)
event_moodle/i18n/pt_BR.po (+0/-195)
event_moodle/i18n/ro.po (+0/-195)
event_moodle/i18n/ru.po (+0/-185)
event_moodle/i18n/sl.po (+0/-185)
event_moodle/i18n/tr.po (+0/-193)
event_moodle/i18n/zh_CN.po (+0/-188)
event_moodle/security/ir.model.access.csv (+0/-3)
event_moodle/wizard_moodle.xml (+0/-50)
event_sale/__openerp__.py (+4/-1)
event_sale/event_demo.xml (+111/-9)
event_sale/event_sale.py (+144/-11)
event_sale/event_sale_data.xml (+25/-0)
event_sale/event_sale_view.xml (+50/-5)
google_account/google_account.py (+8/-8)
google_calendar/res_config.py (+2/-2)
google_drive/google_drive.py (+2/-2)
google_spreadsheet/google_spreadsheet.py (+2/-2)
hr/hr.py (+5/-7)
hr/hr_demo.xml (+60/-1)
hr_holidays/tests/test_holidays_flow.py (+3/-3)
hr_recruitment/hr_recruitment.py (+7/-0)
hr_recruitment/hr_recruitment_view.xml (+8/-1)
hr_recruitment/static/description/index.html (+115/-0)
hr_timesheet/hr_timesheet_data.xml (+4/-0)
hw_escpos/controllers/main.py (+9/-5)
im/static/src/css/im.css (+4/-0)
im_livechat/__openerp__.py (+1/-1)
im_livechat/im_livechat.py (+4/-4)
im_livechat/im_livechat_view.xml (+1/-1)
im_livechat/loader.js (+1/-1)
im_livechat/security/ir.model.access.csv (+2/-2)
knowledge/res_config.py (+0/-2)
knowledge/res_config_view.xml (+0/-4)
l10n_be_hr_payroll/l10n_be_hr_payroll_demo.xml (+16/-0)
l10n_uk/demo/demo.xml (+7/-2)
l10n_ve/__openerp__.py (+1/-1)
lunch/lunch_demo.xml (+11/-0)
mail/__init__.py (+1/-0)
mail/controllers/main.py (+8/-6)
mail/ir_attachment.py (+197/-0)
mail/mail_message.py (+7/-2)
mail/mail_thread.py (+6/-8)
mail/static/src/js/mail.js (+0/-52)
mail/static/src/xml/mail.xml (+3/-3)
mail/tests/test_mail_group.py (+3/-2)
mail/tests/test_mail_message.py (+7/-6)
mail/update.py (+6/-8)
mass_mailing/controllers/main.py (+3/-3)
membership/__openerp__.py (+4/-1)
membership/membership_demo.xml (+40/-10)
membership/membership_demo.yml (+15/-0)
mrp/report/price.py (+0/-1)
multi_company/multi_company_demo.xml (+31/-81)
pad/py_etherpad/__init__.py (+2/-2)
payment/__init__.py (+22/-0)
payment/__openerp__.py (+17/-0)
payment/models/__init__.py (+4/-0)
payment/models/payment_acquirer.py (+507/-0)
payment/models/res_config.py (+22/-0)
payment/security/ir.model.access.csv (+7/-0)
payment/tests/__init__.py (+3/-0)
payment/tests/common.py (+49/-0)
payment/views/payment_acquirer.xml (+179/-0)
payment/views/res_config_view.xml (+28/-0)
payment_adyen/__init__.py (+23/-0)
payment_adyen/__openerp__.py (+17/-0)
payment_adyen/controllers/__init__.py (+3/-0)
payment_adyen/controllers/main.py (+32/-0)
payment_adyen/data/adyen.xml (+18/-0)
payment_adyen/models/__init__.py (+3/-0)
payment_adyen/models/adyen.py (+180/-0)
payment_adyen/tests/__init__.py (+7/-0)
payment_adyen/tests/test_adyen.py (+101/-0)
payment_adyen/views/adyen.xml (+32/-0)
payment_adyen/views/payment_acquirer.xml (+36/-0)
payment_ogone/__init__.py (+23/-0)
payment_ogone/__openerp__.py (+17/-0)
payment_ogone/controllers/__init__.py (+3/-0)
payment_ogone/controllers/main.py (+29/-0)
payment_ogone/data/__init__.py (+3/-0)
payment_ogone/data/ogone.py (+497/-0)
payment_ogone/data/ogone.xml (+20/-0)
payment_ogone/models/__init__.py (+3/-0)
payment_ogone/models/ogone.py (+405/-0)
payment_ogone/tests/__init__.py (+7/-0)
payment_ogone/tests/test_ogone.py (+225/-0)
payment_ogone/views/ogone.xml (+53/-0)
payment_ogone/views/payment_acquirer.xml (+42/-0)
payment_paypal/__init__.py (+23/-0)
payment_paypal/__openerp__.py (+18/-0)
payment_paypal/controllers/__init__.py (+3/-0)
payment_paypal/controllers/main.py (+77/-0)
payment_paypal/data/paypal.xml (+20/-0)
payment_paypal/models/__init__.py (+4/-0)
payment_paypal/models/paypal.py (+403/-0)
payment_paypal/models/res_company.py (+43/-0)
payment_paypal/tests/__init__.py (+7/-0)
payment_paypal/tests/test_paypal.py (+242/-0)
payment_paypal/views/payment_acquirer.xml (+47/-0)
payment_paypal/views/paypal.xml (+43/-0)
payment_paypal/views/res_config_view.xml (+18/-0)
payment_transfer/__init__.py (+23/-0)
payment_transfer/__openerp__.py (+17/-0)
payment_transfer/controllers/__init__.py (+3/-0)
payment_transfer/controllers/main.py (+22/-0)
payment_transfer/data/transfer.xml (+18/-0)
payment_transfer/models/__init__.py (+3/-0)
payment_transfer/models/payment_acquirer.py (+81/-0)
payment_transfer/views/transfer.xml (+23/-0)
point_of_sale/controllers/main.py (+1/-2)
point_of_sale/point_of_sale.py (+0/-77)
point_of_sale/point_of_sale_demo.xml (+163/-159)
point_of_sale/point_of_sale_view.xml (+1/-51)
point_of_sale/security/ir.model.access.csv (+2/-2)
point_of_sale/static/src/js/db.js (+1/-1)
point_of_sale/static/src/js/models.js (+5/-8)
point_of_sale/static/src/js/widgets.js (+1/-1)
portal/__init__.py (+0/-1)
portal/__openerp__.py (+1/-3)
portal/acquirer.py (+0/-108)
portal/acquirer_view.xml (+0/-65)
portal/portal_data.xml (+4/-102)
portal/portal_demo.xml (+6/-45)
portal/portal_view.xml (+4/-8)
portal/security/ir.model.access.csv (+5/-8)
portal/security/portal_security.xml (+0/-16)
portal/tests/test_portal.py (+3/-2)
portal_anonymous/__openerp__.py (+0/-19)
portal_anonymous/i18n/ar.po (+0/-25)
portal_anonymous/i18n/cs.po (+0/-25)
portal_anonymous/i18n/da.po (+0/-25)
portal_anonymous/i18n/de.po (+0/-25)
portal_anonymous/i18n/en_AU.po (+0/-25)
portal_anonymous/i18n/en_GB.po (+0/-25)
portal_anonymous/i18n/es.po (+0/-25)
portal_anonymous/i18n/fi.po (+0/-25)
portal_anonymous/i18n/fr.po (+0/-25)
portal_anonymous/i18n/hr.po (+0/-25)
portal_anonymous/i18n/hu.po (+0/-25)
portal_anonymous/i18n/lt.po (+0/-25)
portal_anonymous/i18n/mk.po (+0/-25)
portal_anonymous/i18n/mn.po (+0/-25)
portal_anonymous/i18n/nl.po (+0/-25)
portal_anonymous/i18n/pl.po (+0/-25)
portal_anonymous/i18n/portal_anonymous.pot (+0/-24)
portal_anonymous/i18n/pt.po (+0/-25)
portal_anonymous/i18n/pt_BR.po (+0/-25)
portal_anonymous/i18n/ro.po (+0/-25)
portal_anonymous/i18n/ru.po (+0/-25)
portal_anonymous/i18n/sl.po (+0/-25)
portal_anonymous/i18n/sv.po (+0/-25)
portal_anonymous/i18n/th.po (+0/-25)
portal_anonymous/i18n/tr.po (+0/-25)
portal_anonymous/i18n/zh_CN.po (+0/-25)
portal_anonymous/portal_anonymous_data.xml (+0/-20)
portal_anonymous/security/ir.model.access.csv (+0/-3)
portal_anonymous/static/src/js/portal_anonymous.js (+0/-100)
portal_anonymous/static/src/xml/portal_anonymous.xml (+0/-14)
portal_claim/security/ir.model.access.csv (+2/-2)
portal_claim/security/portal_security.xml (+1/-1)
portal_crm/__init__.py (+0/-22)
portal_crm/__openerp__.py (+0/-46)
portal_crm/contact.py (+0/-128)
portal_crm/contact_view.xml (+0/-103)
portal_crm/i18n/bs.po (+0/-546)
portal_crm/i18n/cs.po (+0/-548)
portal_crm/i18n/de.po (+0/-564)
portal_crm/i18n/es.po (+0/-566)
portal_crm/i18n/fi.po (+0/-548)
portal_crm/i18n/fr.po (+0/-561)
portal_crm/i18n/he.po (+0/-546)
portal_crm/i18n/hr.po (+0/-546)
portal_crm/i18n/hu.po (+0/-568)
portal_crm/i18n/lt.po (+0/-563)
portal_crm/i18n/mk.po (+0/-563)
portal_crm/i18n/nl.po (+0/-567)
portal_crm/i18n/pl.po (+0/-555)
portal_crm/i18n/portal_crm.pot (+0/-529)
portal_crm/i18n/pt.po (+0/-547)
portal_crm/i18n/pt_BR.po (+0/-567)
portal_crm/i18n/ro.po (+0/-568)
portal_crm/i18n/sl.po (+0/-546)
portal_crm/i18n/sv.po (+0/-548)
portal_crm/i18n/th.po (+0/-546)
portal_crm/i18n/tr.po (+0/-563)
portal_crm/i18n/zh_CN.po (+0/-546)
portal_crm/security/ir.model.access.csv (+0/-3)
portal_crm/static/src/css/portal_crm.css (+0/-40)
portal_crm/test/contact_form.yml (+0/-38)
portal_event/__init__.py (+0/-20)
portal_event/__openerp__.py (+0/-46)
portal_event/i18n/cs.po (+0/-59)
portal_event/i18n/de.po (+0/-59)
portal_event/i18n/es.po (+0/-59)
portal_event/i18n/fr.po (+0/-59)
portal_event/i18n/hr.po (+0/-59)
portal_event/i18n/hu.po (+0/-59)
portal_event/i18n/mk.po (+0/-59)
portal_event/i18n/nl.po (+0/-59)
portal_event/i18n/portal_event.pot (+0/-58)
portal_event/i18n/pt.po (+0/-59)
portal_event/i18n/pt_BR.po (+0/-59)
portal_event/i18n/ro.po (+0/-59)
portal_event/i18n/sl.po (+0/-59)
portal_event/i18n/sv.po (+0/-59)
portal_event/i18n/tr.po (+0/-59)
portal_event/i18n/zh_CN.po (+0/-59)
portal_event/portal_event_view.xml (+0/-23)
portal_event/security/ir.model.access.csv (+0/-5)
portal_event/security/portal_security.xml (+0/-24)
portal_gamification/security/ir.model.access.csv (+6/-6)
portal_gamification/security/portal_security.xml (+1/-1)
portal_hr_employees/__init__.py (+0/-22)
portal_hr_employees/__openerp__.py (+0/-43)
portal_hr_employees/hr_employee.py (+0/-69)
portal_hr_employees/hr_employee_view.xml (+0/-96)
portal_hr_employees/i18n/cs.po (+0/-95)
portal_hr_employees/i18n/de.po (+0/-95)
portal_hr_employees/i18n/es.po (+0/-95)
portal_hr_employees/i18n/fr.po (+0/-95)
portal_hr_employees/i18n/hr.po (+0/-95)
portal_hr_employees/i18n/hu.po (+0/-95)
portal_hr_employees/i18n/lt.po (+0/-95)
portal_hr_employees/i18n/mk.po (+0/-95)
portal_hr_employees/i18n/nl.po (+0/-95)
portal_hr_employees/i18n/pl.po (+0/-95)
portal_hr_employees/i18n/portal_hr_employees.pot (+0/-94)
portal_hr_employees/i18n/pt.po (+0/-95)
portal_hr_employees/i18n/pt_BR.po (+0/-96)
portal_hr_employees/i18n/ro.po (+0/-95)
portal_hr_employees/i18n/sl.po (+0/-95)
portal_hr_employees/i18n/th.po (+0/-95)
portal_hr_employees/i18n/tr.po (+0/-95)
portal_hr_employees/i18n/zh_CN.po (+0/-95)
portal_hr_employees/security/ir.model.access.csv (+0/-3)
portal_hr_employees/static/src/css/portal_hr_employees.css (+0/-19)
portal_project/security/ir.model.access.csv (+12/-12)
portal_project/security/portal_security.xml (+8/-8)
portal_project/tests/test_access_rights.py (+39/-38)
portal_project_issue/security/ir.model.access.csv (+3/-3)
portal_project_issue/security/portal_security.xml (+4/-4)
portal_project_issue/tests/test_access_rights.py (+10/-9)
portal_project_long_term/security/ir.model.access.csv (+2/-2)
portal_project_long_term/security/portal_security.xml (+4/-4)
portal_sale/__openerp__.py (+1/-1)
portal_sale/portal_sale.py (+8/-6)
portal_sale/res_config_view.xml (+1/-1)
portal_sale/security/ir.model.access.csv (+19/-19)
portal_sale/security/portal_security.xml (+4/-4)
portal_stock/security/ir.model.access.csv (+4/-4)
portal_stock/security/portal_security.xml (+2/-2)
procurement/procurement_view.xml (+39/-3)
product/__openerp__.py (+4/-1)
product/pricelist.py (+118/-155)
product/product.py (+225/-131)
product/product_data.xml (+8/-1)
product/product_demo.xml (+285/-89)
product/product_image_demo.xml (+9/-9)
product/product_view.xml (+298/-101)
product/security/ir.model.access.csv (+2/-0)
product/security/product_security.xml (+15/-7)
product/test/product_pricelist.yml (+8/-8)
product_email_template/views/product_view.xml (+4/-2)
product_visible_discount/product_visible_discount.py (+0/-6)
project/static/description/index.html (+0/-1)
project/tests/test_project_flow.py (+2/-2)
project_issue/project_issue.py (+0/-2)
purchase/purchase.py (+0/-1)
purchase/purchase_view.xml (+19/-7)
purchase_requisition/purchase_requisition.py (+0/-1)
purchase_requisition/wizard/purchase_requisition_partner.py (+0/-2)
report_intrastat/report_intrastat_view.xml (+2/-1)
resource/resource.py (+8/-6)
resource/tests/test_resource.py (+8/-3)
sale/res_config.py (+39/-9)
sale/res_config_view.xml (+9/-2)
sale/sale.py (+7/-3)
sale/test/sale_order_demo.yml (+4/-4)
sale_crm/__openerp__.py (+0/-1)
sale_crm/report/sale_crm_account_invoice_report_view.xml (+0/-22)
sale_crm/sale_crm_demo.xml (+1/-1)
sale_stock/res_config.py (+0/-3)
sale_stock/res_config_view.xml (+0/-6)
share/__openerp__.py (+2/-1)
share/share_data.xml (+9/-0)
share/wizard/share_wizard.py (+0/-1)
stock/product_view.xml (+32/-27)
stock/stock_demo.xml (+3/-3)
stock/stock_view.xml (+7/-1)
stock/test/shipment.yml (+2/-0)
stock/wizard/stock_fill_inventory.py (+3/-1)
website/__init__.py (+3/-0)
website/__openerp__.py (+30/-0)
website/controllers/__init__.py (+3/-0)
website/controllers/main.py (+370/-0)
website/data/website_data.xml (+204/-0)
website/data/website_demo.xml (+16/-0)
website/models/__init__.py (+9/-0)
website/models/ir_http.py (+171/-0)
website/models/ir_qweb.py (+518/-0)
website/models/ir_ui_view.py (+146/-0)
website/models/res_config.py (+34/-0)
website/models/test_models.py (+39/-0)
website/models/website.py (+672/-0)
website/security/ir.model.access.csv (+9/-0)
website/security/ir_ui_view.xml (+25/-0)
website/static/description/index.html (+272/-0)
website/static/lib/MutationObservers/AUTHORS (+9/-0)
website/static/lib/MutationObservers/LICENSE (+27/-0)
website/static/lib/MutationObservers/MutationObserver.js (+542/-0)
website/static/lib/MutationObservers/PATENTS (+23/-0)
website/static/lib/MutationObservers/README.md (+4/-0)
website/static/lib/MutationObservers/last-ref.txt (+8/-0)
website/static/lib/MutationObservers/package.json (+23/-0)
website/static/lib/MutationObservers/test/attributes.js (+276/-0)
website/static/lib/MutationObservers/test/callback.js (+72/-0)
website/static/lib/MutationObservers/test/characterData.js (+106/-0)
website/static/lib/MutationObservers/test/childList.js (+377/-0)
website/static/lib/MutationObservers/test/index.html (+81/-0)
website/static/lib/MutationObservers/test/mixed.js (+36/-0)
website/static/lib/MutationObservers/test/sidetable.js (+35/-0)
website/static/lib/MutationObservers/test/transient.js (+283/-0)
website/static/lib/ace/ace.js (+11/-0)
website/static/lib/ace/mode-xml.js (+1/-0)
website/static/lib/ace/theme-monokai.js (+1/-0)
website/static/lib/bootstrap-tour/bootstrap-tour.css (+43/-0)
website/static/lib/bootstrap-tour/bootstrap-tour.js (+559/-0)
website/static/lib/bootstrap/css/bootstrap-theme.min.css (+268/-0)
website/static/lib/bootstrap/css/bootstrap.css (+3788/-0)
website/static/lib/bootstrap/fonts/glyphicons-halflings-regular.svg (+228/-0)
website/static/lib/bootstrap/js/bootstrap.js (+2006/-0)
website/static/lib/jquery.mjs.nestedSortable/jquery.mjs.nestedSortable.js (+429/-0)
website/static/lib/nearest/README.md (+22/-0)
website/static/lib/nearest/bower.json (+12/-0)
website/static/lib/nearest/jquery.nearest.js (+223/-0)
website/static/lib/nearest/jquery.nearest.min.js (+11/-0)
website/static/lib/nearest/nearest.jquery.json (+24/-0)
website/static/lib/select2-bootstrap-css/README.md (+16/-0)
website/static/lib/select2-bootstrap-css/select2-bootstrap.css (+420/-0)
website/static/lib/vkbeautify/vkbeautify.0.99.00.beta.js (+358/-0)
website/static/src/css/Makefile (+4/-0)
website/static/src/css/bootswatch/amelia.min.css (+1/-0)
website/static/src/css/bootswatch/cerulean.min.css (+1/-0)
website/static/src/css/bootswatch/cosmo.min.css (+1/-0)
website/static/src/css/bootswatch/cyborg.min.css (+1/-0)
website/static/src/css/bootswatch/flatly.min.css (+1/-0)
website/static/src/css/bootswatch/journal.min.css (+1/-0)
website/static/src/css/bootswatch/readable.min.css (+1/-0)
website/static/src/css/bootswatch/simplex.min.css (+1/-0)
website/static/src/css/bootswatch/slate.min.css (+1/-0)
website/static/src/css/bootswatch/spacelab.min.css (+1/-0)
website/static/src/css/bootswatch/united.min.css (+1/-0)
website/static/src/css/bootswatch/yeti.min.css (+1/-0)
website/static/src/css/common.sass (+25/-0)
website/static/src/css/editor.css (+466/-0)
website/static/src/css/editor.sass (+409/-0)
website/static/src/css/fonts/glyphicons-halflings-regular.svg (+228/-0)
website/static/src/css/snippets.css (+588/-0)
website/static/src/css/snippets.sass (+467/-0)
website/static/src/css/website.backend.css (+6/-0)
website/static/src/css/website.css (+512/-0)
website/static/src/css/website.sass (+412/-0)
website/static/src/js/website.ace.js (+302/-0)
website/static/src/js/website.backend.js (+32/-0)
website/static/src/js/website.editor.js (+1692/-0)
website/static/src/js/website.editor.newpage.js (+29/-0)
website/static/src/js/website.js (+294/-0)
website/static/src/js/website.menu.js (+199/-0)
website/static/src/js/website.mobile.js (+28/-0)
website/static/src/js/website.seo.js (+527/-0)
website/static/src/js/website.snippets.animation.js (+122/-0)
website/static/src/js/website.snippets.editor.js (+1443/-0)
website/static/src/js/website.tests.js (+40/-0)
website/static/src/js/website.tour.banner.js (+118/-0)
website/static/src/js/website.tour.js (+439/-0)
website/static/src/js/website.translator.js (+209/-0)
website/static/src/xml/website.ace.xml (+19/-0)
website/static/src/xml/website.backend.xml (+25/-0)
website/static/src/xml/website.editor.xml (+251/-0)
website/static/src/xml/website.menu.xml (+65/-0)
website/static/src/xml/website.seo.xml (+141/-0)
website/static/src/xml/website.snippets.xml (+97/-0)
website/static/src/xml/website.tour.xml (+27/-0)
website/static/src/xml/website.translator.xml (+53/-0)
website/static/src/xml/website.xml (+127/-0)
website/tests/__init__.py (+4/-0)
website/tests/cases.py (+35/-0)
website/tests/test_converter.py (+240/-0)
website/tests/test_requests.py (+128/-0)
website/tests/test_ui.py (+153/-0)
website/tests/test_views.py (+220/-0)
website/tests/ui_suite/dummy_test.js (+4/-0)
website/tests/ui_suite/homepage_test.js (+17/-0)
website/tests/ui_suite/simple_dom_test.js (+14/-0)
website/tests/ui_suite/ui_test_runner.js (+93/-0)
website/views/res_config.xml (+99/-0)
website/views/snippets.xml (+967/-0)
website/views/themes.xml (+279/-0)
website/views/website_templates.xml (+742/-0)
website/views/website_views.xml (+77/-0)
website_blog/__init__.py (+24/-0)
website_blog/__openerp__.py (+52/-0)
website_blog/controllers/__init__.py (+1/-0)
website_blog/controllers/main.py (+261/-0)
website_blog/data/website_blog_data.xml (+50/-36)
website_blog/data/website_blog_demo.xml (+331/-125)
website_blog/doc/changelog.rst (+9/-0)
website_blog/doc/index.rst (+10/-0)
website_blog/models/__init__.py (+1/-0)
website_blog/models/website_blog.py (+154/-68)
website_blog/security/ir.model.access.csv (+6/-3)
website_blog/security/website_blog.xml (+13/-0)
website_blog/static/description/index.html (+245/-0)
website_blog/static/src/css/Makefile (+2/-0)
website_blog/static/src/css/website_blog.css (+23/-0)
website_blog/static/src/css/website_blog.sass (+22/-0)
website_blog/static/src/js/website.tour.blog.js (+119/-0)
website_blog/static/src/js/website_blog.editor.js (+31/-0)
website_blog/static/src/xml/website_blog.xml (+7/-0)
website_blog/tests/__init__.py (+24/-0)
website_blog/tests/test_ui.py (+5/-0)
website_blog/tests/test_website_blog.yml (+7/-28)
website_blog/tests/ui_suite/post_test.js (+17/-0)
website_blog/views/website_blog_templates.xml (+403/-0)
website_blog/views/website_blog_views.xml (+91/-94)
website_blog/wizard/__init__.py (+0/-1)
website_blog/wizard/document_page_show_diff.py (+4/-4)
website_blog/wizard/document_page_show_diff_view.xml (+4/-4)
website_crm/__init__.py (+1/-0)
website_crm/__openerp__.py (+19/-0)
website_crm/controllers/__init__.py (+3/-0)
website_crm/controllers/main.py (+56/-0)
website_crm/data/website_crm_data.xml (+23/-0)
website_crm/static/description/index.html (+91/-0)
website_crm/views/website_crm.xml (+91/-0)
website_crm_partner_assign/__init__.py (+2/-0)
website_crm_partner_assign/__openerp__.py (+17/-0)
website_crm_partner_assign/controllers/__init__.py (+1/-0)
website_crm_partner_assign/controllers/main.py (+110/-0)
website_crm_partner_assign/models/__init__.py (+2/-0)
website_crm_partner_assign/models/res_partner.py (+9/-0)
website_crm_partner_assign/models/website.py (+11/-0)
website_crm_partner_assign/views/website_crm_partner_assign.xml (+124/-0)
website_customer/__init__.py (+22/-0)
website_customer/__openerp__.py (+44/-0)
website_customer/controllers/__init__.py (+1/-0)
website_customer/controllers/main.py (+108/-0)
website_customer/views/website_customer.xml (+176/-0)
website_customer/website_customer_demo.xml (+123/-0)
website_event/__init__.py (+23/-0)
website_event/__openerp__.py (+25/-0)
website_event/controllers/__init__.py (+3/-0)
website_event/controllers/main.py (+215/-0)
website_event/data/event_data.xml (+22/-0)
website_event/data/event_demo.xml (+507/-0)
website_event/doc/changelog.rst (+9/-0)
website_event/doc/index.rst (+10/-0)
website_event/models/__init__.py (+1/-0)
website_event/models/event.py (+122/-0)
website_event/security/ir.model.access.csv (+3/-0)
website_event/security/website_event.xml (+15/-0)
website_event/static/description/index.html (+254/-0)
website_event/static/src/js/website.tour.event.js (+117/-0)
website_event/static/src/js/website_event.editor.js (+29/-0)
website_event/static/src/xml/website_event.xml (+7/-0)
website_event/tests/__init__.py (+30/-0)
website_event/tests/test_controllers.py (+29/-0)
website_event/tests/test_ui.py (+5/-0)
website_event/tests/ui_suite/event_test.js (+17/-0)
website_event/views/website_event.xml (+347/-0)
website_event/views/website_event_sale_backend.xml (+22/-0)
website_event_sale/__init__.py (+23/-0)
website_event_sale/__openerp__.py (+23/-0)
website_event_sale/controllers/__init__.py (+1/-0)
website_event_sale/controllers/main.py (+100/-0)
website_event_sale/models/__init__.py (+3/-0)
website_event_sale/models/product.py (+9/-0)
website_event_sale/models/sale_order.py (+22/-0)
website_event_sale/models/website.py (+10/-0)
website_event_sale/security/ir.model.access.csv (+5/-0)
website_event_sale/security/website_event_sale.xml (+25/-0)
website_event_sale/views/website_event_sale.xml (+74/-0)
website_event_track/__init__.py (+23/-0)
website_event_track/__openerp__.py (+34/-0)
website_event_track/controllers/__init__.py (+2/-0)
website_event_track/controllers/event.py (+127/-0)
website_event_track/data/event_data.xml (+36/-0)
website_event_track/data/event_demo.xml (+194/-0)
website_event_track/models/__init__.py (+1/-0)
website_event_track/models/event.py (+178/-0)
website_event_track/security/event.xml (+17/-0)
website_event_track/security/ir.model.access.csv (+16/-0)
website_event_track/static/description/index.html (+103/-0)
website_event_track/static/src/css/website_event_track.css (+54/-0)
website_event_track/views/event_backend.xml (+364/-0)
website_event_track/views/website_event.xml (+432/-0)
website_google_map/__init__.py (+2/-0)
website_google_map/__openerp__.py (+18/-0)
website_google_map/controllers/__init__.py (+3/-0)
website_google_map/controllers/main.py (+48/-0)
website_google_map/models/__init__.py (+1/-0)
website_google_map/models/res_partner.py (+28/-0)
website_google_map/static/src/js/google_map.js (+84/-0)
website_google_map/static/src/js/markerclusterer.js (+1294/-0)
website_google_map/static/src/js/markerclusterer_compiled.js (+21/-0)
website_google_map/views/google_map.xml (+42/-0)
website_hr/__init__.py (+2/-0)
website_hr/__openerp__.py (+24/-0)
website_hr/controllers/__init__.py (+1/-0)
website_hr/controllers/main.py (+17/-0)
website_hr/data/website_hr_data.xml (+16/-0)
website_hr/data/website_hr_demo.xml (+36/-0)
website_hr/models/__init__.py (+1/-0)
website_hr/models/hr.py (+17/-0)
website_hr/security/ir.model.access.csv (+2/-0)
website_hr/security/website_hr.xml (+15/-0)
website_hr/views/website_hr.xml (+27/-0)
website_hr_recruitment/__init__.py (+2/-0)
website_hr_recruitment/__openerp__.py (+27/-0)
website_hr_recruitment/controllers/__init__.py (+3/-0)
website_hr_recruitment/controllers/main.py (+91/-0)
website_hr_recruitment/data/config_data.xml (+21/-0)
website_hr_recruitment/data/hr_job_demo.xml (+919/-0)
website_hr_recruitment/models/__init__.py (+1/-0)
website_hr_recruitment/models/hr_job.py (+26/-0)
website_hr_recruitment/security/ir.model.access.csv (+3/-0)
website_hr_recruitment/security/website_hr_recruitment_security.xml (+23/-0)
website_hr_recruitment/static/description/index.html (+183/-0)
website_hr_recruitment/static/src/js/website_hr_recruitment.editor.js (+15/-0)
website_hr_recruitment/static/src/xml/website_hr_recruitment.xml (+7/-0)
website_hr_recruitment/views/hr_job_views.xml (+17/-0)
website_hr_recruitment/views/templates.xml (+275/-0)
website_livechat/__init__.py (+1/-0)
website_livechat/__openerp__.py (+21/-0)
website_livechat/models/__init__.py (+1/-0)
website_livechat/models/website.py (+8/-0)
website_livechat/views/website_livechat.xml (+30/-0)
website_mail/__init__.py (+23/-0)
website_mail/__openerp__.py (+48/-0)
website_mail/controllers/__init__.py (+2/-0)
website_mail/controllers/email_designer.py (+20/-0)
website_mail/controllers/main.py (+58/-0)
website_mail/doc/changelog.rst (+9/-0)
website_mail/doc/index.rst (+10/-0)
website_mail/models/__init__.py (+3/-0)
website_mail/models/email_template.py (+90/-0)
website_mail/models/mail_message.py (+65/-0)
website_mail/models/mail_thread.py (+37/-0)
website_mail/security/website_mail.xml (+15/-0)
website_mail/static/src/css/website_mail.css (+4/-0)
website_mail/static/src/js/website_email_designer.js (+17/-0)
website_mail/static/src/js/website_mail.js (+30/-0)
website_mail/tests/__init__.py (+28/-0)
website_mail/tests/test_controllers.py (+40/-0)
website_mail/views/email_template_view.xml (+16/-0)
website_mail/views/snippets.xml (+459/-0)
website_mail/views/website_email_designer.xml (+54/-0)
website_mail/views/website_mail.xml (+31/-0)
website_membership/__init__.py (+2/-0)
website_membership/__openerp__.py (+21/-0)
website_membership/controllers/__init__.py (+1/-0)
website_membership/controllers/main.py (+115/-0)
website_membership/demo/membership.xml (+19/-0)
website_membership/models/__init__.py (+1/-0)
website_membership/models/product.py (+32/-0)
website_membership/security/ir.model.access.csv (+2/-0)
website_membership/security/website_membership.xml (+25/-0)
website_membership/views/website_membership.xml (+128/-0)
website_partner/__init__.py (+22/-0)
website_partner/__openerp__.py (+44/-0)
website_partner/controllers/__init__.py (+1/-0)
website_partner/controllers/main.py (+43/-0)
website_partner/data/website_data.xml (+8/-0)
website_partner/models/__init__.py (+3/-0)
website_partner/models/res_company.py (+10/-0)
website_partner/models/res_partner.py (+25/-0)
website_partner/models/website.py (+10/-0)
website_partner/views/res_partner_view.xml (+21/-0)
website_partner/views/website_partner_view.xml (+71/-0)
website_partner/website_partner_demo.xml (+248/-0)
website_payment/__init__.py (+20/-0)
website_payment/__openerp__.py (+19/-0)
website_payment/doc/changelog.rst (+9/-0)
website_payment/doc/index.rst (+10/-0)
website_payment/static/lib/jquery.payment/jquery.payment.js (+497/-0)
website_payment/static/src/css/Makefile (+2/-0)
website_payment/static/src/css/website_payment.css (+53/-0)
website_payment/static/src/css/website_payment.sass (+45/-0)
website_payment/static/src/js/payment_acquirer.js (+58/-0)
website_payment/views/website_payment_templates.xml (+31/-0)
website_payment/views/website_settings_payment.xml (+22/-0)
website_project/__init__.py (+2/-0)
website_project/__openerp__.py (+19/-0)
website_project/controllers/__init__.py (+1/-0)
website_project/controllers/main.py (+50/-0)
website_project/models/__init__.py (+1/-0)
website_project/models/website_project.py (+9/-0)
website_project/views/website_project.xml (+54/-0)
website_quote/__init__.py (+2/-0)
website_quote/__openerp__.py (+24/-0)
website_quote/controllers/__init__.py (+3/-0)
website_quote/controllers/main.py (+171/-0)
website_quote/data/website_quotation_data.xml (+86/-0)
website_quote/data/website_quotation_demo.xml (+531/-0)
website_quote/models/__init__.py (+1/-0)
website_quote/models/order.py (+243/-0)
website_quote/security/ir.model.access.csv (+8/-0)
website_quote/static/description/index.html (+63/-0)
website_quote/static/lib/jSignature/jSignature.min.js (+77/-0)
website_quote/static/src/css/website_quotation.css (+56/-0)
website_quote/static/src/js/website_quotation.js (+92/-0)
website_quote/views/website_quotation.xml (+520/-0)
website_quote/views/website_quotation_backend.xml (+138/-0)
website_sale/__init__.py (+2/-0)
website_sale/__openerp__.py (+25/-0)
website_sale/controllers/__init__.py (+1/-0)
website_sale/controllers/main.py (+787/-0)
website_sale/data/website_sale_data.xml (+36/-0)
website_sale/data/website_sale_demo.xml (+551/-0)
website_sale/models/__init__.py (+7/-0)
website_sale/models/payment_transaction.py (+11/-0)
website_sale/models/product.py (+151/-0)
website_sale/models/product_characteristics.py (+87/-0)
website_sale/models/res_config.py (+15/-0)
website_sale/models/sale_order.py (+50/-0)
website_sale/models/website.py (+222/-0)
website_sale/models/website_styles.py (+30/-0)
website_sale/security/ir.model.access.csv (+14/-0)
website_sale/security/website_sale.xml (+27/-0)
website_sale/static/description/index.html (+344/-0)
website_sale/static/src/css/Makefile (+3/-0)
website_sale/static/src/css/website_mail.css (+51/-0)
website_sale/static/src/css/website_mail.sass (+50/-0)
website_sale/static/src/css/website_sale.css (+399/-0)
website_sale/static/src/css/website_sale.sass (+349/-0)
website_sale/static/src/js/website.tour.shop.js (+239/-0)
website_sale/static/src/js/website_sale.editor.js (+94/-0)
website_sale/static/src/js/website_sale.js (+114/-0)
website_sale/static/src/js/website_sale_payment.js (+12/-0)
website_sale/static/src/js/website_sale_validate.js (+29/-0)
website_sale/static/src/xml/website_sale.xml (+7/-0)
website_sale/tests/__init__.py (+1/-0)
website_sale/tests/test_ui.py (+8/-0)
website_sale/tests/ui_suite/website_sale-sale_process-test-2.js (+17/-0)
website_sale/tests/ui_suite/website_sale-sale_process-test.js (+17/-0)
website_sale/views/website_sale.xml (+1061/-0)
website_sale/views/website_sale_backend.xml (+98/-0)
website_sale_crm/__openerp__.py (+15/-0)
website_sale_crm/data/website_sale_crm.xml (+13/-0)
website_sale_crm/models/__init__.py (+1/-0)
website_sale_crm/models/website.py (+14/-0)
website_sale_delivery/__init__.py (+2/-0)
website_sale_delivery/__openerp__.py (+20/-0)
website_sale_delivery/controllers/__init__.py (+1/-0)
website_sale_delivery/controllers/main.py (+22/-0)
website_sale_delivery/models/__init__.py (+2/-0)
website_sale_delivery/models/sale_order.py (+74/-0)
website_sale_delivery/models/website.py (+47/-0)
website_sale_delivery/security/ir.model.access.csv (+2/-0)
website_sale_delivery/static/src/js/website_sale_delivery.js (+10/-0)
website_sale_delivery/views/website_sale_delivery.xml (+48/-0)
website_sale_delivery/views/website_sale_delivery_view.xml (+20/-0)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-website-al
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+172007@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'account/account_unit_test.xml'
2--- account/account_unit_test.xml 2012-11-29 22:26:45 +0000
3+++ account/account_unit_test.xml 2014-01-31 00:21:10 +0000
4@@ -8,7 +8,7 @@
5 <field name="partner_id" ref="base.res_partner_1"/>
6 <field name="journal_id" ref="account.sales_journal"/>
7 <field name="state">draft</field>
8- <field name="type">out_invoice</field>
9+ <field name="type">in_invoice</field>
10 <field name="account_id" ref="account.a_recv"/>
11 <field name="name">Test invoice 1</field>
12 </record>
13
14=== modified file 'account/account_view.xml'
15--- account/account_view.xml 2013-12-30 07:24:52 +0000
16+++ account/account_view.xml 2014-01-31 00:21:10 +0000
17@@ -1211,6 +1211,7 @@
18 <record id="view_move_line_tree_reconcile" model="ir.ui.view">
19 <field name="model">account.move.line</field>
20 <field eval="24" name="priority"/>
21+ <field name="type">tree</field>
22 <field name="arch" type="xml">
23 <tree_account_reconciliation colors="red:state == 'draft';black:state == 'valid'" string="Journal Items to Reconcile" create="false" version="7.0">
24 <field name="date"/>
25
26=== modified file 'account/product_view.xml'
27--- account/product_view.xml 2013-10-27 12:31:04 +0000
28+++ account/product_view.xml 2014-01-31 00:21:10 +0000
29@@ -11,12 +11,16 @@
30 <page string="Accounting" groups="account.group_account_invoice">
31 <group name="properties">
32 <group>
33- <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"/>
34- <field name="taxes_id" colspan="2" attrs="{'readonly':[('sale_ok','=',0)]}" widget="many2many_tags"/>
35+ <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"
36+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
37+ <field name="taxes_id" colspan="2" widget="many2many_tags"
38+ attrs="{'readonly':[ '|', ('sale_ok','=',0), ('is_only_child', '=', False)]}"/>
39 </group>
40 <group>
41- <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"/>
42- <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/>
43+ <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"
44+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
45+ <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"
46+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
47 </group>
48 </group>
49 </page>
50@@ -31,12 +35,16 @@
51 <field name="arch" type="xml">
52 <notebook position="inside">
53 <page string="Accounting">
54- <separator string="Sales Properties" colspan="2"/>
55- <separator string="Purchase Properties" colspan="2"/>
56- <field name="property_account_income" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
57- <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
58- <field name="taxes_id"/>
59- <field name="supplier_taxes_id"/>
60+ <group name="properties">
61+ <group>
62+ <field name="property_account_income" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
63+ <field name="taxes_id" colspan="2" widget="many2many_tags"/>
64+ </group>
65+ <group>
66+ <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
67+ <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/>
68+ </group>
69+ </group>
70 </page>
71 </notebook>
72 </field>
73
74=== modified file 'account/res_config_view.xml'
75--- account/res_config_view.xml 2014-01-24 11:08:02 +0000
76+++ account/res_config_view.xml 2014-01-31 00:21:10 +0000
77@@ -234,14 +234,14 @@
78 <group name="bank_cash">
79 <label for="id" string="Configuration"/>
80 <div>
81- <div>
82+ <div name='company_footer'>
83 <label for="company_footer"/>
84 <button name="open_company_form" type="object"
85 string="Configure your company bank accounts" icon="gtk-go-forward"
86 class="oe_inline oe_link"/>
87 <field name="company_footer"/>
88 </div>
89- <div>
90+ <div name='payment_acquirer'>
91 <label for="paypal_account"/>
92 <field name="paypal_account" placeholder="e.g. sales@openerp.com" class="oe_inline"/>
93 </div>
94
95=== modified file 'account_anglo_saxon/product_view.xml'
96--- account_anglo_saxon/product_view.xml 2012-11-29 22:26:45 +0000
97+++ account_anglo_saxon/product_view.xml 2014-01-31 00:21:10 +0000
98@@ -6,11 +6,11 @@
99 <field name="model">product.product</field>
100 <field name="inherit_id" ref="account.product_normal_form_view"/>
101 <field name="arch" type="xml">
102- <xpath expr="//field[@name='property_account_expense']" position="after">
103+ <field name="property_account_expense" position="after">
104 <label string="" colspan="2"/>
105 <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
106 <newline/>
107- </xpath>
108+ </field>
109 </field>
110 </record>
111
112@@ -19,10 +19,10 @@
113 <field name="model">product.template</field>
114 <field name="inherit_id" ref="account.product_template_form_view"/>
115 <field name="arch" type="xml">
116- <xpath expr="/form/notebook/page/field[@name='property_account_expense']" position="after">
117+ <field name="property_account_expense" position="after">
118 <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
119 <newline/>
120- </xpath>
121+ </field>
122 </field>
123 </record>
124
125
126=== modified file 'auth_oauth/__openerp__.py'
127--- auth_oauth/__openerp__.py 2012-11-20 14:19:21 +0000
128+++ auth_oauth/__openerp__.py 2014-01-31 00:21:10 +0000
129@@ -33,17 +33,13 @@
130 'website': 'http://www.openerp.com',
131 'depends': ['base', 'web', 'base_setup'],
132 'data': [
133+ 'res_users.xml',
134 'auth_oauth_data.xml',
135 'auth_oauth_data.yml',
136 'auth_oauth_view.xml',
137- 'security/ir.model.access.csv'
138- ],
139- 'js': ['static/src/js/auth_oauth.js'],
140- 'css': [
141- 'static/lib/zocial/css/zocial.css',
142- 'static/src/css/auth_oauth.css',
143- ],
144- 'qweb': ['static/src/xml/auth_oauth.xml'],
145+ 'security/ir.model.access.csv',
146+ 'views/auth_oauth_login.xml',
147+ ],
148 'installable': True,
149 'auto_install': False,
150 }
151
152=== modified file 'auth_oauth/auth_oauth_data.xml'
153--- auth_oauth/auth_oauth_data.xml 2012-11-28 00:14:49 +0000
154+++ auth_oauth/auth_oauth_data.xml 2014-01-31 00:21:10 +0000
155@@ -17,7 +17,7 @@
156 <field name="scope"></field>
157 <field name="validation_endpoint">https://graph.facebook.com/me/permissions</field>
158 <field name="data_endpoint"></field>
159- <field name="css_class">zocial facebook</field>
160+ <field name="css_class">fa fa-facebook-square</field>
161 <field name="body">Log in with facebook</field>
162 </record>
163 <record id="provider_google" model="auth.oauth.provider">
164@@ -26,7 +26,7 @@
165 <field name="scope">https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile</field>
166 <field name="validation_endpoint">https://www.googleapis.com/oauth2/v1/tokeninfo</field>
167 <field name="data_endpoint">https://www.googleapis.com/oauth2/v1/userinfo</field>
168- <field name="css_class">zocial google</field>
169+ <field name="css_class">fa fa-google-plus-square</field>
170 <field name="body">Log in with google</field>
171 </record>
172 <!--
173@@ -36,7 +36,7 @@
174 <field name="scope"></field>
175 <field name="validation_endpoint">https://api.twitter.com/oauth/authorize</field>
176 <field name="data_endpoint"></field>
177- <field name="css_class">zocial twitter</field>
178+ <field name="css_class">fa-twitter</field>
179 <field name="body">Sign in with twitter</field>
180 </record>
181 -->
182
183=== modified file 'auth_oauth/controllers/main.py'
184--- auth_oauth/controllers/main.py 2013-11-27 15:32:57 +0000
185+++ auth_oauth/controllers/main.py 2014-01-31 00:21:10 +0000
186@@ -8,9 +8,10 @@
187 import openerp
188 from openerp import SUPERUSER_ID
189 from openerp import http
190-from openerp.http import request
191+from openerp.http import request, LazyResponse
192 from openerp.addons.web.controllers.main import db_monodb, set_cookie_and_redirect, login_and_redirect
193 from openerp.modules.registry import RegistryManager
194+from openerp.tools.translate import _
195
196 _logger = logging.getLogger(__name__)
197
198@@ -34,22 +35,60 @@
199 return func(self, *a, **kw)
200 return wrapper
201
202-
203 #----------------------------------------------------------
204 # Controller
205 #----------------------------------------------------------
206-class OAuthController(http.Controller):
207-
208- @http.route('/auth_oauth/list_providers', type='json', auth='none')
209- def list_providers(self, dbname):
210+class OAuthLogin(openerp.addons.web.controllers.main.Home):
211+ def list_providers(self):
212 try:
213- registry = RegistryManager.get(dbname)
214- with registry.cursor() as cr:
215- providers = registry.get('auth.oauth.provider')
216- l = providers.read(cr, SUPERUSER_ID, providers.search(cr, SUPERUSER_ID, [('enabled', '=', True)]))
217+ provider_obj = request.registry.get('auth.oauth.provider')
218+ providers = provider_obj.search_read(request.cr, SUPERUSER_ID, [('enabled', '=', True)])
219 except Exception:
220- l = []
221- return l
222+ providers = []
223+ for provider in providers:
224+ return_url = request.httprequest.url_root + 'auth_oauth/signin'
225+ state = self.get_state(provider)
226+ params = dict(
227+ debug=request.debug,
228+ response_type='token',
229+ client_id=provider['client_id'],
230+ redirect_uri=return_url,
231+ scope=provider['scope'],
232+ state=simplejson.dumps(state),
233+ )
234+ provider['auth_link'] = provider['auth_endpoint'] + '?' + werkzeug.url_encode(params)
235+
236+ return providers
237+
238+ def get_state(self, provider):
239+ return dict(
240+ d=request.session.db,
241+ p=provider['id']
242+ )
243+
244+ @http.route()
245+ def web_login(self, *args, **kw):
246+ providers = self.list_providers()
247+
248+ response = super(OAuthLogin, self).web_login(*args, **kw)
249+ if isinstance(response, LazyResponse):
250+ error = request.params.get('oauth_error')
251+ if error == '1':
252+ error = _("Sign up is not allowed on this database.")
253+ elif error == '2':
254+ error = _("Access Denied")
255+ elif error == '3':
256+ error = _("You do not have access to this database or your invitation has expired. Please ask for an invitation and be sure to follow the link in your invitation email.")
257+ else:
258+ error = None
259+
260+ response.params['values']['providers'] = providers
261+ if error:
262+ response.params['values']['error'] = error
263+
264+ return response
265+
266+class OAuthController(http.Controller):
267
268 @http.route('/auth_oauth/signin', type='http', auth='none')
269 @fragment_to_query_string
270@@ -66,27 +105,27 @@
271 cr.commit()
272 action = state.get('a')
273 menu = state.get('m')
274- url = '/'
275+ url = '/web'
276 if action:
277- url = '/#action=%s' % action
278+ url = '/web#action=%s' % action
279 elif menu:
280- url = '/#menu_id=%s' % menu
281+ url = '/web#menu_id=%s' % menu
282 return login_and_redirect(*credentials, redirect_url=url)
283 except AttributeError:
284 # auth_signup is not installed
285 _logger.error("auth_signup not installed on database %s: oauth sign up cancelled." % (dbname,))
286- url = "/#action=login&oauth_error=1"
287+ url = "/web/login?oauth_error=1"
288 except openerp.exceptions.AccessDenied:
289 # oauth credentials not valid, user could be on a temporary session
290 _logger.info('OAuth2: access denied, redirect to main page in case a valid session exists, without setting cookies')
291- url = "/#action=login&oauth_error=3"
292+ url = "/web/login?oauth_error=3"
293 redirect = werkzeug.utils.redirect(url, 303)
294 redirect.autocorrect_location_header = False
295 return redirect
296 except Exception, e:
297 # signup error
298 _logger.exception("OAuth2: %s" % str(e))
299- url = "/#action=login&oauth_error=2"
300+ url = "/web/login?oauth_error=2"
301
302 return set_cookie_and_redirect(url)
303
304@@ -105,7 +144,7 @@
305 try:
306 model, provider_id = IMD.get_object_reference(cr, SUPERUSER_ID, 'auth_oauth', 'provider_openerp')
307 except ValueError:
308- return set_cookie_and_redirect('/?db=%s' % dbname)
309+ return set_cookie_and_redirect('/web?db=%s' % dbname)
310 assert model == 'auth.oauth.provider'
311
312 state = {
313
314=== modified file 'auth_oauth/res_users.py'
315--- auth_oauth/res_users.py 2012-11-27 10:06:35 +0000
316+++ auth_oauth/res_users.py 2014-01-31 00:21:10 +0000
317@@ -1,6 +1,6 @@
318 import logging
319
320-import urllib
321+import werkzeug.urls
322 import urlparse
323 import urllib2
324 import simplejson
325@@ -25,7 +25,7 @@
326 ]
327
328 def _auth_oauth_rpc(self, cr, uid, endpoint, access_token, context=None):
329- params = urllib.urlencode({'access_token': access_token})
330+ params = werkzeug.url_encode({'access_token': access_token})
331 if urlparse.urlparse(endpoint)[4]:
332 url = endpoint + '&' + params
333 else:
334
335=== modified file 'auth_oauth/res_users.xml'
336--- auth_oauth/res_users.xml 2012-08-14 11:55:55 +0000
337+++ auth_oauth/res_users.xml 2014-01-31 00:21:10 +0000
338@@ -10,7 +10,7 @@
339 <xpath expr="//page[@string='Access Rights']" position="after">
340 <page string="Oauth">
341 <group>
342- <field name="oauth_provider"/>
343+ <field name="oauth_provider_id"/>
344 <field name="oauth_uid"/>
345 <field name="oauth_access_token"/>
346 </group>
347
348=== removed directory 'auth_oauth/static'
349=== removed directory 'auth_oauth/static/lib'
350=== removed directory 'auth_oauth/static/lib/zocial'
351=== removed file 'auth_oauth/static/lib/zocial/README.md'
352--- auth_oauth/static/lib/zocial/README.md 2012-08-15 22:47:08 +0000
353+++ auth_oauth/static/lib/zocial/README.md 1970-01-01 00:00:00 +0000
354@@ -1,31 +0,0 @@
355-# Zocial CSS social buttons
356-
357-I basically rewrote this entire set so they are full vector buttons, meaning:
358-
359-- @font-face icons
360-- custom font file for all social icons
361-- icon font use private unicode spaces for accessibility
362-- em sizing based on button font-size
363-- support for about 83 different services
364-- buttons and icons supported
365-- no raster images (sweet)
366-- works splendidly on any browser supporting @font-face
367-- CSS3 degrades gracefully in IE8 and below etc.
368-- also includes generic icon-less primary and secondary buttons
369-
370-## How to use these buttons
371-
372- <button class='zocial facebook'>Button label here</button>
373-
374-or
375-
376- <a class="zocial twitter'>Button label</a>
377-
378-- Can be any element e.g. `a`, `div`, `button` etc.
379-- Add class of `.zocial`
380-- Add class for name of service e.g. `.dropbox`, `.twitter`, `.github`
381-- Done :-)
382-
383-Check out [zocial.smcllns.com](http://zocial.smcllns.com) for demo and code examples.
384-
385-Problems, questions or requests to [@smcllns](http://twitter.com/smcllns)
386\ No newline at end of file
387
388=== removed directory 'auth_oauth/static/lib/zocial/css'
389=== removed file 'auth_oauth/static/lib/zocial/css/zocial-regular-webfont.eot'
390Binary files auth_oauth/static/lib/zocial/css/zocial-regular-webfont.eot 2013-10-27 12:31:04 +0000 and auth_oauth/static/lib/zocial/css/zocial-regular-webfont.eot 1970-01-01 00:00:00 +0000 differ
391=== removed file 'auth_oauth/static/lib/zocial/css/zocial-regular-webfont.svg'
392--- auth_oauth/static/lib/zocial/css/zocial-regular-webfont.svg 2013-10-27 12:31:04 +0000
393+++ auth_oauth/static/lib/zocial/css/zocial-regular-webfont.svg 1970-01-01 00:00:00 +0000
394@@ -1,129 +0,0 @@
395-<?xml version="1.0" standalone="no"?>
396-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
397-<svg xmlns="http://www.w3.org/2000/svg">
398-<metadata></metadata>
399-<defs>
400-<font id="ZocialRegular" horiz-adv-x="2048" >
401-<font-face units-per-em="2048" ascent="1638" descent="-410" />
402-<missing-glyph horiz-adv-x="512" />
403-<glyph unicode=" " horiz-adv-x="512" />
404-<glyph unicode="&#x09;" horiz-adv-x="512" />
405-<glyph unicode="&#xa0;" horiz-adv-x="512" />
406-<glyph unicode="&#xa3;" horiz-adv-x="3291" />
407-<glyph unicode="&#x2000;" horiz-adv-x="987" />
408-<glyph unicode="&#x2001;" horiz-adv-x="1974" />
409-<glyph unicode="&#x2002;" horiz-adv-x="987" />
410-<glyph unicode="&#x2003;" horiz-adv-x="1974" />
411-<glyph unicode="&#x2004;" horiz-adv-x="658" />
412-<glyph unicode="&#x2005;" horiz-adv-x="493" />
413-<glyph unicode="&#x2006;" horiz-adv-x="329" />
414-<glyph unicode="&#x2007;" horiz-adv-x="329" />
415-<glyph unicode="&#x2008;" horiz-adv-x="246" />
416-<glyph unicode="&#x2009;" horiz-adv-x="394" />
417-<glyph unicode="&#x200a;" horiz-adv-x="109" />
418-<glyph unicode="&#x202f;" horiz-adv-x="394" />
419-<glyph unicode="&#x205f;" horiz-adv-x="493" />
420-<glyph unicode="&#xe000;" horiz-adv-x="1024" d="M0 0z" />
421-<glyph unicode="&#xe001;" horiz-adv-x="2650" d="M0 823q0 125 37 236t102 196.5t154.5 156t192 119.5t216.5 83t227.5 49.5t225.5 15.5q59 0 88 -2q232 -12 463 -84q140 -45 272.5 -113.5t255.5 -165t214.5 -209t146.5 -255t55 -293.5q0 -27 -2 -39q-9 -128 -56.5 -243.5t-122 -205.5t-174.5 -164.5t-210.5 -126.5 t-233.5 -85q-222 -62 -469 -62h-16q-172 0 -346.5 25.5t-298.5 83.5q-11 4 -14 12q0 4 6 4q2 0 7 -1t7 -1q101 -24 182 -24q34 0 70 6t73.5 19.5t61 41t23.5 64.5q0 23 -13 49q-18 33 -119.5 68.5t-233.5 68.5t-155 41q-163 54 -284 135q1 1 7 18.5t11.5 30.5t14.5 25t18 12 h367q15 0 28.5 -28t24.5 -61t36 -61t60 -28q36 0 63 24t27 60q0 22 -172.5 407t-216.5 474q-13 30 -33 30q-15 0 -26 -18l-6 -12q-16 -31 -107 -234l-219 -487l-14 -31q-90 103 -142.5 226.5t-52.5 252.5zM446 483q0 10 111 265l10 6q13 0 67 -131t54 -142q0 -8 -10 -8h-221 q-11 0 -11 10zM1075 231q0 -92 96 -92q97 0 97 92v795q0 92 -97 92q-96 0 -96 -92v-795zM1454 231q0 -92 96 -92q97 0 97 92v371l188 -379q11 -25 34 -42t50 -17q31 0 56.5 16.5t37.5 42.5l187 379v-371q0 -92 96 -92q98 0 98 92v795q0 92 -96 92q-71 0 -96 -59l-283 -619 l-272 619q-27 59 -99 59q-94 0 -94 -92v-795z" />
422-<glyph unicode="&#xe002;" horiz-adv-x="2066" d="M0 -348v1026h1026v-1026h-1026zM1042 674v1026h1024v-1026h-1024z" />
423-<glyph unicode="&#xe003;" horiz-adv-x="1994" d="M0 -147l397 1824h897q81 0 159 -23.5t148.5 -72t117 -122.5t64 -174t-10.5 -228q-59 -278 -263 -438t-479 -160h-375l-129 -606h-526zM205 -371h526l129 604h377q179 0 332 70t261 206.5t148 321.5q57 277 -88 449q68 -153 25 -348q-59 -278 -262.5 -438t-478.5 -160 h-375l-129 -604h-443zM731 807h170l86 375h256q5 0 35 -6q-18 60 -65 95.5t-113 35.5h-256zM987 809q98 3 183 75t108 173q1 4 2 12t2 12h-233z" />
424-<glyph unicode="&#xe004;" horiz-adv-x="1959" d="M0 -137v1052q0 180 41 320t125.5 242.5t220.5 156.5t318 54h589h533q-11 -11 -108 -109.5t-205 -207t-223 -223.5t-193.5 -190t-85.5 -75q-13 0 -22 10t-9 22v320h-98q-79 0 -135 -5.5t-107 -20.5t-83 -41.5t-56 -68.5t-34.5 -102t-10.5 -141v-537zM137 -377 q11 11 108 109.5t205 207t223 223.5t193.5 190t85.5 75q13 0 22 -10t9 -23v-319h98q79 0 135 5.5t106.5 20.5t82.5 41.5t55.5 68.5t34 101.5t10.5 141.5v536l459 457v-1053q0 -180 -41 -320t-125 -242t-220 -156t-318 -54h-590h-533z" />
425-<glyph unicode="&#xe005;" horiz-adv-x="1886" d="M0 453v551q0 52 38 90.5t91 38.5q54 0 91.5 -38t37.5 -91v-551q0 -54 -37.5 -91.5t-91.5 -37.5t-91.5 37.5t-37.5 91.5zM354 248v856h1176v-856q0 -54 -38 -91.5t-91 -37.5h-918q-54 0 -91.5 37.5t-37.5 91.5zM354 1200h1176q0 157 -83 282t-216.5 191t-288.5 66 t-288.5 -66t-216.5 -191t-83 -282zM561 1847q0 17 14 17q7 0 15 -4l100 -183l-31 -16q-2 4 -29 52t-48 88t-21 46zM592 195q0 56 38.5 92.5t96.5 36.5q53 0 91 -38t38 -91v-414q0 -57 -39 -93t-96 -36q-54 0 -91.5 37.5t-37.5 91.5v414zM602 1464q0 32 24 56t58 24 q32 0 56 -24t24 -56q0 -34 -24 -58t-58 -24q-32 0 -56 24t-24 58zM1028 195q0 56 39.5 92.5t95.5 36.5q54 0 91.5 -38t37.5 -91v-414q0 -57 -39 -93t-96 -36q-54 0 -91.5 37.5t-37.5 91.5v414zM1120 1464q0 32 24 56t58 24q32 0 56 -24t24 -56q0 -34 -24 -58t-58 -24 q-32 0 -56 24t-24 58zM1194 1677q2 4 28.5 58t49.5 91.5t37 37.5t14 -19v-4l-98 -182zM1626 453v548q0 54 37.5 93t91.5 39t91.5 -39t37.5 -93v-548q0 -54 -38 -91.5t-91 -37.5q-54 0 -92 37.5t-37 91.5z" />
426-<glyph unicode="&#xe006;" horiz-adv-x="1687" d="M0 659q0 222 59 414q58 190 170 326q115 139 277 209q165 73 364 73q262 0 445 -125q185 -121 278 -321q95 -198 95 -401q0 -189 -97 -246q-95 -56 -270 -56h-866q0 -175 61 -303q59 -133 156 -196q103 -68 217 -68q81 0 145 21q65 20 127 67q65 46 115 97q52 52 135 141 q29 33 96 33q71 0 111 -43q43 -43 43 -119q0 -68 -47 -160q-44 -87 -144 -174q-92 -83 -237 -139t-330 -56q-427 0 -665 277t-238 749zM455 819h802q-15 257 -122 385q-106 127 -279 127q-167 0 -272 -129q-108 -129 -129 -383z" />
427-<glyph unicode="&#xe007;" horiz-adv-x="1169" d="M0 -150v1610q0 91 64 155t155 64h731q91 0 155 -64t64 -155v-1610q0 -91 -64 -155t-155 -64h-731q-91 0 -155 64t-64 155zM68 70h1030v1245h-1030v-1245zM408 1497q0 -20 13.5 -33.5t33.5 -13.5h260q20 0 33.5 13.5t13.5 33.5q0 19 -13.5 32t-33.5 13h-260 q-20 0 -33.5 -13t-13.5 -32zM496 -147q0 -38 28 -65.5t66 -27.5t65 27.5t27 65.5t-27 65t-65 27t-66 -27t-28 -65z" />
428-<glyph unicode="&#xe008;" horiz-adv-x="2265" d="M0 324v979q0 94 29 122.5t123 28.5h1962q93 0 121 -28.5t28 -122.5v-979q0 -94 -27.5 -122t-121.5 -28h-832v-76h227v-118h-755v118h227v76h-829q-94 0 -123 28.5t-29 121.5zM76 307h2111v1057h-2111v-1057z" />
429-<glyph unicode="&#xe009;" d="M0 1192q0 52 33 93.5t84 53.5l403 97q-129 -147 -129 -344q0 -381 518 -580q44 -17 86.5 -37t93 -52t87 -66t61.5 -80t25 -93q0 -59 -36.5 -103t-89 -63.5t-110.5 -19.5q-119 0 -248 46.5t-215 123.5l-162 -367q113 -61 295 -125q-22 -5 -64.5 -17.5t-78.5 -20t-66 -7.5 q-52 0 -93.5 33t-53.5 84l-336 1407q-4 24 -4 37zM858 1098q0 53 37.5 91.5t87.5 54.5t102 16q100 0 225.5 -36t180.5 -96l125 349q-188 100 -381 129q10 2 94 24.5t143 35.5t89 13q53 0 94 -32.5t53 -83.5l336 -1407q4 -24 4 -37q0 -53 -33 -94.5t-84 -53.5l-297 -69 q97 146 97 311q0 118 -42 217t-117 171t-164.5 122.5t-199.5 87.5q-42 14 -81 30t-91 44t-89 57.5t-63 71t-26 84.5z" />
430-<glyph unicode="&#xe00a;" horiz-adv-x="2424" d="M0 -2q0 86 48.5 169t130.5 146.5t199 102.5t245 39h110q-86 82 -86 176q0 58 33 119q-20 -2 -59 -2q-213 0 -348.5 132.5t-135.5 327.5q0 122 78.5 230t205.5 171.5t267 63.5h635l-141 -102h-201q96 -37 150.5 -139.5t54.5 -227.5q0 -96 -49 -181.5t-131 -150.5 q-75 -59 -98 -93.5t-23 -86.5q0 -39 55 -98.5t111 -99.5q124 -88 172.5 -180t48.5 -232q0 -87 -42 -168t-118.5 -146t-197 -104t-265.5 -39q-177 0 -324 44.5t-236 131t-89 197.5zM229 66q0 -140 119.5 -240t298.5 -100q243 0 353 89.5t110 239.5q0 39 -8 66 q-6 22 -14.5 41.5t-25.5 39t-28 32.5t-39.5 34.5t-41.5 30.5t-52 35.5t-53 36.5q-81 24 -158 24q-120 1 -226.5 -43t-170.5 -120.5t-64 -165.5zM365 1210q22 -161 123.5 -277.5t224.5 -119.5q80 -3 141 46.5t88.5 138t13.5 194.5q-22 161 -122.5 274.5t-223.5 116.5 q-123 4 -194 -104.5t-51 -268.5zM1501 1161v103h410v409h102v-409h412v-103h-412v-411h-102v411h-410z" />
431-<glyph unicode="&#xe00b;" horiz-adv-x="2265" d="M0 1378v43l4 4h510l4 -4v-41q0 -16 -20 -16l-54 -2q-67 -3 -67 -41q0 -25 14 -57q104 -250 455 -992l12 -2l227 453q-27 61 -45 100l-155 307q-15 26 -25 46.5t-13 27.5l-3 8q-4 9 -12 25q-44 87 -61 104q-19 16 -64 23q-29 3 -29 14v43l6 4h403l11 -2v-43q0 -16 -21 -16 l-30 -4q-27 -4 -39.5 -10t-11 -24.5t9 -36.5t28.5 -62l150 -307l166 331q34 64 10 88q-13 18 -76 23l-18 2q-9 0 -15 6q-6 3 -6 12v39l6 4q118 2 381 0l4 -4v-41q0 -16 -18 -16q-45 -1 -62 -8.5t-34 -32.5q-48 -73 -62 -98l-215 -402l-6 -14l262 -537l17 -6l413 985 q24 58 -6 84q-15 14 -30.5 20t-49.5 7l-39 2q-6 0 -12 6q-8 4 -8 12v41l6 4h469l4 -4v-41q0 -15 -18 -18q-94 -3 -136 -39q-41 -33 -69 -100q-168 -388 -296 -678.5t-172 -386.5l-44 -97q-21 -48 -46 -62t-49 3t-46 62q-84 169 -250 538q-207 -429 -269 -541 q-28 -49 -54.5 -64t-49 1.5t-41.5 60.5q-65 153 -265.5 583t-266.5 587q-34 85 -58 106t-106 27q-29 3 -29 14z" />
432-<glyph unicode="&#xe00c;" horiz-adv-x="1923" d="M-0.5 1438q-2.5 18 3.5 34t15 29t27 26.5t35 23.5t44 22t48 21t54 22.5t55 23.5q111 46 199 33.5t110 -71.5q51 -136 209.5 -652.5t236.5 -742.5q528 173 668 215q2 0 24 4t28 4.5t24 0t26.5 -5.5t20.5 -15.5t20 -26.5q48 -96 68 -203t0 -151q-39 -30 -122 -65.5 t-154 -59.5t-184.5 -59.5t-149.5 -47.5q-21 -7 -78.5 -27t-108 -37t-118.5 -39t-124.5 -36t-110.5 -23.5t-91.5 -7t-52.5 18.5q-38 38 -66.5 107t-58.5 178t-39 135q-85 254 -230.5 690t-214.5 643q-10 21 -12.5 39z" />
433-<glyph unicode="&#xe00d;" horiz-adv-x="1593" d="M6 -285v1588h189q0 116 11 156q24 90 127 99q13 1 27 1q24 0 44.5 -3t36 -10.5t27.5 -14t21 -21t15 -23.5t10 -29t6 -30.5t3 -35t1 -35v-37.5v-17h113v17q0 114 16 157q33 81 148 82q27 0 49.5 -4.5t38.5 -11t29 -19.5t21 -23.5t13.5 -31t8.5 -33t4.5 -38.5t1.5 -39.5 v-42.5v-13h110v13v42.5t1.5 39.5t4.5 38.5t8.5 33.5t13.5 30.5t21 23.5t29 19.5t38.5 11t49.5 4.5q24 0 44.5 -3t36 -10.5t27.5 -14t21 -21t15 -23.5t10 -29t6 -30.5t3 -35t1 -35v-37.5v-17h188v-1588h-1589zM139 78v-230h285v230h-285zM139 123h285v244h-285v-244zM139 412 h285v266h-285v-266zM139 721h285v229h-285v-229zM285 1137q0 -37 18.5 -52.5t56.5 -15.5t57 15.5t19 52.5v266q0 37 -18.5 52t-57.5 15q-38 0 -56.5 -15t-18.5 -52v-266zM467 78v-230h311v230h-311zM467 123h311v244h-311v-244zM467 412h311v266h-311v-266zM467 721h311v229 h-311v-229zM725 1137q0 -37 19 -52.5t57 -15.5q78 0 78 68v266q0 37 -19.5 52t-58.5 15t-57.5 -15t-18.5 -52v-266zM821 78v-230h312v230h-312zM821 123h312v244h-312v-244zM821 412h312v266h-312v-266zM821 721h312v229h-312v-229zM1165 1137q0 -68 78 -68q38 0 57 15.5 t19 52.5v266q0 37 -18.5 52t-57.5 15t-58.5 -15t-19.5 -52v-266zM1176 78v-230h286v230h-286zM1176 123h286v244h-286v-244zM1176 412h286v266h-286v-266zM1176 721h286v229h-286v-229z" />
434-<glyph unicode="&#xe00e;" horiz-adv-x="2680" d="M0 225v371h459v-367q0 -59 41.5 -100t99.5 -41q60 0 101.5 41t41.5 100v867q0 158 81.5 291t219 209.5t297.5 76.5t297.5 -77t219 -211t81.5 -293v-189l-274 -82l-182 86v164q0 58 -41.5 99.5t-100.5 41.5q-60 0 -101.5 -41t-41.5 -100v-854q0 -161 -80.5 -297.5 t-218 -215.5t-299.5 -79q-122 0 -233.5 47.5t-191.5 127.5t-127.5 191.5t-47.5 233.5zM1483 219v375l182 -86l274 82v-377q0 -60 41.5 -101.5t100.5 -41.5t100 41.5t41 101.5v383h459v-371q0 -122 -47.5 -233.5t-127.5 -191.5t-190.5 -127.5t-232.5 -47.5 q-162 0 -300.5 79.5t-219 216.5t-80.5 298z" />
435-<glyph unicode="&#xe00f;" horiz-adv-x="2576" d="M-10 401h243q11 -82 61.5 -131t131.5 -49q97 0 156 67t59 167q0 98 -57.5 161.5t-153.5 63.5q-41 0 -70 -10.5t-46 -25t-32 -29t-37 -25t-52 -10.5q-109 0 -164 4q18 106 57.5 328t58.5 337h676v-200h-497q-37 -187 -50 -275h7q34 43 102.5 65.5t134.5 22.5 q112 0 197 -55t131 -156q50 122 147.5 192t227.5 70q77 0 140 -18t122.5 -63t93 -77.5t98.5 -104.5q15 -17 23 -25q107 123 157 166q126 110 278 119q16 1 32 1q184 0 296.5 -123.5t112.5 -310.5q0 -124 -48.5 -225t-144 -162t-220.5 -61q-237 0 -463 268 q-22 -21 -69.5 -67.5t-69 -66.5t-64.5 -52.5t-76.5 -46.5t-83 -25.5t-104.5 -11.5q-129 0 -227.5 67.5t-151.5 188.5q-62 -128 -168.5 -195.5t-247.5 -67.5q-125 0 -223.5 39.5t-160.5 127.5t-62 214zM1044 463q0 -87 52 -140t139 -53q152 0 317 195q-93 95 -131 125 q-101 82 -194 82q-81 0 -132 -63t-51 -146zM1841 463q41 -44 69 -70.5t70.5 -59t87.5 -48t93 -15.5q87 0 137.5 56.5t50.5 144.5q0 87 -52 144t-138 57q-41 0 -78 -12t-71 -37t-56.5 -46t-58.5 -59t-54 -55z" />
436-<glyph unicode="&#xe010;" horiz-adv-x="1585" d="M0 938q0 102 33 204.5t103 198.5t167.5 169.5t237 118t301.5 44.5q163 0 304.5 -56.5t236 -150t148.5 -215.5t54 -252q0 -229 -79 -412.5t-224.5 -288.5t-331.5 -105q-92 0 -173 43t-113 104l-82 -324q-10 -38 -26.5 -78.5t-35.5 -77t-39 -69.5t-40 -61.5t-34 -48 t-26 -35.5l-12 -15q-6 -7 -16.5 -4.5t-12.5 11.5q0 2 -3.5 28.5t-6.5 56.5t-5.5 77t-2 91.5t5.5 97t16 97.5q23 95 152 641q-17 33 -27 79t-11 76l-1 29q0 131 66 218.5t161 87.5q76 0 118 -50.5t42 -126.5q0 -64 -48.5 -223t-56.5 -194q-21 -92 36 -160t151 -68 q108 0 194 86t132 228.5t46 312.5q0 199 -129.5 325t-359.5 126q-130 0 -240.5 -46.5t-184 -124.5t-114.5 -180t-41 -213q0 -136 78 -231q16 -20 19 -31t-2 -35q-3 -10 -12.5 -47t-12.5 -47q-4 -22 -20.5 -30t-36.5 1q-120 49 -181 169.5t-61 279.5z" />
437-<glyph unicode="&#xe011;" d="M0.5 624q-5.5 136 30.5 273q34 135 101.5 255t159 212.5t205.5 162.5t240 105t262 40.5t273 -30.5q135 -34 255 -101.5t212.5 -159t162.5 -205.5t105 -240t40.5 -262t-30.5 -273q-34 -135 -101.5 -255t-159 -212.5t-205.5 -162.5t-240 -105t-262 -40.5t-273 30.5 q-135 34 -255 101.5t-212.5 159t-162.5 205.5t-105 240t-40.5 262zM498 342l147 -37q14 -3 40.5 -10t39.5 -10l-47 -187l113 -28l45 184q8 -2 40.5 -10t49.5 -13l-45 -184l112 -27l45 187q98 -17 175.5 -16t135.5 42t87 125q65 185 -105 273q124 27 144 164q14 96 -47 157.5 t-179 100.5l47 186l-112 27l-45 -181q-17 5 -49.5 13t-40.5 10l45 180l-113 29l-45 -184q-28 4 -72 16l-155 39l-29 -121l80 -18q57 -15 53 -66l-53 -211q4 0 12 -4q-2 1 -6 2t-6 2l-74 -295q-10 -36 -51 -26l-68 16q-6 2 -14 4zM872 389l62 248q109 -26 122 -30 q190 -60 163 -173q-6 -25 -22.5 -42.5t-35.5 -26t-48 -11t-51.5 -2t-56 6.5t-51.5 10t-47.5 11.5t-34.5 8.5zM963 750l55 225q7 -2 24 -6q45 -10 73 -18.5t71 -28.5t60 -51.5t7 -73.5q-6 -26 -21.5 -43.5t-39 -24t-46 -9t-53.5 2t-49.5 8t-47 11t-33.5 8.5z" />
438-<glyph unicode="&#xe012;" horiz-adv-x="2312" d="M0 1223h158l219 -744l147 500l-71 244h157l219 -744l220 744h157h436v-74l-223 -385q119 -41 176 -137q62 -103 62 -234q0 -167 -88 -280t-230 -113q-104 0 -184 68q-79 70 -115 182l123 51q26 -68 72 -111q41 -38 104 -38q64 0 107 69q45 68 45 172q0 108 -47 170 q-55 70 -170 70h-62v74l211 364h-254l-14 -24l-311 -1047h-15l-225 758l-227 -758h-15zM1675 369l37 -103q31 -69 68 -119q88 -120 192 -137q93 -17 180 37q42 26 72 64q41 41 57 73q9 14 23 41l-23 121q-17 -32 -33.5 -57t-23.5 -34l-8 -9q-71 -76 -125 -101 q-40 -18 -69.5 -22.5t-69.5 0.5q-56 4 -123 49q-1 1 -16.5 14t-25.5 22t-24 24t-22 28q-27 37 -66 109zM1731 768q0 173 67 299q32 62 76 99t88 40q71 7 143 -53q37 -30 76 -102l90 178l25 -156l-90 -174q-16 33 -39 61.5t-38 41.5l-15 12q-36 25 -66 31.5t-66 -1.5 q-48 -9 -96 -60.5t-71 -121.5q-39 -113 -39 -217q-2 -82 10 -129q-24 45 -38 108t-16 104z" />
439-<glyph unicode="&#xe013;" horiz-adv-x="2394" d="M0 772q0 106 42.5 202t114 166t170.5 111t208 41q175 0 312.5 -98t192.5 -254l136 131l323 -311l895 913v-829l-547 -422l70 -74l-743 -723l-648 629q-143 2 -264 72t-191.5 188.5t-70.5 257.5zM76 772q0 -184 132.5 -313t321.5 -129q70 0 134 18l450 -399l1198 942 l2 618l-1184 -1220l-184 299q41 87 41 184q0 183 -134 312.5t-323 129.5t-321.5 -129.5t-132.5 -312.5zM174 768q0 144 101.5 245t244.5 101q145 0 245.5 -100.5t100.5 -245.5q0 -143 -101 -244.5t-245 -101.5q-142 0 -244 102t-102 244z" />
440-<glyph unicode="&#xe014;" horiz-adv-x="1454" d="M33 1268h1431l-135 -1454l-581 -166l-582 166zM166 1391v272h92v-90h82v90h90v-272h-90v90h-82v-90h-92zM299 971l49 -545l2 4h615l-21 -231l-196 -56l-199 58l-12 139h-181l25 -279l367 -104l366 104l51 547h-653l-16 183h686l16 180h-899zM471 1571v92h250v-92h-80 v-180h-90v180h-80zM760 1391v272h96l55 -94l58 94h96v-272h-88v139l-66 -103v3l-61 96v-135h-90zM1112 1391v272h90v-180h127v-92h-217z" />
441-<glyph unicode="&#xe015;" horiz-adv-x="1931" d="M-0.5 -39.5q2.5 52.5 14.5 94.5q48 171 87 270q201 511 613 844q63 51 130 97v28q-122 -51 -243.5 -134.5t-208 -166t-156 -158t-104.5 -122.5l-34 -47q-2 89 17 174t51.5 151t72.5 124.5t80.5 99.5t74 71.5t54.5 45.5l21 14q7 4 20.5 11.5t57.5 28t89 37t112.5 34 t132.5 25t143 4t150 -23.5q83 60 168 104.5t147 64.5t112.5 31.5t76.5 13.5l26 1q59 6 103 -6t68.5 -37.5t38.5 -59.5t16 -73t-1 -78.5t-11 -75.5t-16 -64t-14 -45l-6 -17l-10 10q44 116 42.5 191t-36 115.5t-75 59.5t-73.5 22l-34 3q-9 0 -24.5 -1t-65 -10.5t-100.5 -25.5 t-124 -51.5t-141 -83.5q111 -18 203.5 -61t155 -99.5t112.5 -125t78 -139.5t48 -140.5t27 -130.5t10 -108t2 -74l-1 -27h-1141q-4 -63 9.5 -114t38 -82.5t55 -54.5t61.5 -33.5t56.5 -17t42.5 -7.5h16q9 0 23.5 1t53.5 11.5t71 28.5t64 58t44 95h598q-26 -95 -71 -176.5 t-99 -138.5t-117 -103t-126.5 -74.5t-125 -49.5t-115 -30.5t-94 -15t-63.5 -6.5h-23q-160 0 -219 12q-77 -61 -161 -105.5t-150 -65t-120.5 -32t-83.5 -13.5l-30 -1q-76 0 -132.5 31.5t-85 80t-42 107t-11 111zM154.5 -55q-0.5 -48 5.5 -87t15 -58l9 -19q4 -4 11.5 -9.5 t34.5 -18.5t58.5 -21t84 -9.5t109.5 9.5t135.5 42.5t162.5 82.5q-16 4 -43.5 11.5t-103.5 36.5t-141 64.5t-136.5 97t-109.5 132.5q-45 -69 -68 -137.5t-23.5 -116.5zM733 813h543q3 74 -23.5 129t-65.5 80t-79 39.5t-68 16.5l-28 1q-6 0 -16 -0.5t-39.5 -6t-56.5 -14.5 t-59.5 -29t-55.5 -47t-38 -71t-14 -98z" />
442-<glyph unicode="&#xe016;" horiz-adv-x="1843" d="M86 1190q3 33 31 65l245 246q12 10 25 8t19 -16l198 -373q16 -33 -10 -63l-90 -90q-25 -25 -29 -64q0 -38 26 -92t63 -104t74 -94t63 -71l26 -26q10 -10 27.5 -27t68 -60.5t96.5 -76.5t100.5 -60t92.5 -26q39 0 66 27l106 106q11 11 29.5 14t32.5 -5l358 -211 q14 -8 16 -21t-8 -24l-246 -246q-32 -28 -65 -31q-73 -10 -160 9.5t-167.5 59t-161 89.5t-146 102.5t-117 96t-79.5 70.5l-29 28q-11 11 -29 29.5t-69 78t-97 119t-100.5 144.5t-91.5 162.5t-57.5 165.5t-10.5 161z" />
443-<glyph unicode="&#xe017;" d="M0 651q0 208 81 397.5t218.5 327t327 218.5t397.5 81t397.5 -81t327 -218.5t218.5 -327t81 -397.5t-81 -397.5t-218.5 -327t-327 -218.5t-397.5 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM264 651q0 -29 2 -48.5t8.5 -43.5t22.5 -40.5t41 -24.5q14 -5 35 -9 q85 -3 174 82q82 73 119 185q50 155 20 409q-4 24 -4 35q-6 12 0 18q3 6 27 -2q80 -20 159 -59q96 -44 209 -143q94 -82 178 -183q79 -94 164 -213q83 -116 180 -157q47 -22 80.5 -17t56 21.5t36 49t19 66.5t5.5 74q0 98 -24 197q-4 18 -17 57q-29 89 -84 172 q-106 161 -277.5 253.5t-363.5 92.5q-137 0 -256 -45q-164 -57 -288 -182.5t-181 -290.5q-3 -9 -9 -28.5t-9 -28.5q-26 -106 -23 -197z" />
444-<glyph unicode="&#xe018;" horiz-adv-x="2498" d="M0 1370q-3 10 5 19.5t18 11.5q22 4 62.5 13.5t57.5 12.5q1 34 2 100.5t2 100.5q3 25 27 25q11 0 20 -8t9 -21q-4 -122 -4 -186q23 5 71 15l72 15q38 7 113.5 20.5t113.5 20.5q830 142 1626 148q12 0 19.5 -10t5.5 -21q-1 -23 -4 -68t-4 -67q39 -3 262 -23q11 0 18.5 -9 t6.5 -19q-46 -282 -139.5 -845t-139.5 -845q76 -12 156 -24q16 -3 21.5 -17t-1 -26.5t-20.5 -12.5h-6q-26 4 -79.5 13.5t-80.5 13.5q-3 -28 -10 -64q-3 -18 -21 -22q-2 -2 -8 -2h-8q-615 154 -1229 239q-255 5 -305 5q-56 0 -338 -5q0 -1 1 -3t1 -3q1 -13 -8.5 -21.5 t-22.5 -8.5q-21 0 -24 22q-1 9 -4.5 31.5t-4.5 34.5h-26q-16 1 -21.5 14.5t2 27t23.5 13.5h2h14l-12 111q-15 109 -41.5 320.5t-44 342.5t-51 311.5t-74.5 329.5zM61 1354q43 -158 89 -412q-7 167 -7 428q-30 -4 -82 -16zM199 1167q3 -403 43 -868q6 -78 22 -223 q2 -24 9.5 -68.5t9.5 -54.5q136 -6 392.5 -26.5t373.5 -26.5q27 -1 137.5 -7t149 -8.5t134 -8t148.5 -9.5t133.5 -10.5t149 -13.5t137.5 -15q22 328 66 932t61 842q-953 -9 -1966 -220q-3 -108 0 -215zM387 834q0 -140 87 -228t222 -88q142 0 224 88h4q-27 -144 -133 -227 q-84 -69 -207 -78q-82 -7 -107 -4v-154q72 0 117 4q217 16 350 140q178 168 178 477q0 193 -96 314.5t-270 121.5q-159 0 -264 -108t-105 -258zM580 846q0 92 46 150.5t119 58.5h3q89 0 133.5 -73t42.5 -185q0 -32 -11 -54q-54 -86 -165 -86q-77 0 -122.5 53.5t-45.5 135.5z M762 -131l196 -21l764 -81q292 -63 428 -99q1 6 3.5 18.5t3.5 18.5q-177 28 -338 51q-508 71 -1057 113zM1155 834q0 -140 88 -228t221 -88q141 0 226 88h2q-27 -143 -131 -227q-87 -69 -209 -78q-82 -7 -107 -4v-154q72 0 117 4q217 16 350 140q178 163 178 477 q0 193 -95.5 314.5t-268.5 121.5q-161 0 -266 -108t-105 -258zM1348 846q0 92 46.5 150.5t118.5 58.5h3q89 0 133.5 -73t42.5 -185q0 -32 -11 -54q-54 -86 -165 -86q-77 0 -122.5 53.5t-45.5 135.5zM2079 -227q12 -2 41.5 -6.5t46.5 -6.5q40 245 132 802t140 855 q-22 2 -104 9.5t-127 9.5q-12 -173 -55 -750.5t-64 -892.5q0 -10 -8 -18q-2 0 -2 -2z" />
445-<glyph unicode="&#xe019;" horiz-adv-x="1708" d="M0 -369l854 2048l854 -2048h-756v277l348 174l-26 113l-322 -162v137l201 106l-29 117l-172 -92v178h-188v-321l-176 121l-33 -132l209 -143v-373h-764z" />
446-<glyph unicode="&#xe01a;" horiz-adv-x="2299" d="M-2 106v762q0 11 7.5 19t19.5 8h360v264q0 11 7.5 20t19.5 9h200v-1053q0 -11 -7 -20t-17 -9h-590zM221 276h137q12 0 19.5 8.5t7.5 20.5v422h-137q-12 0 -19.5 -9t-7.5 -20v-422zM682 106v762q0 11 7.5 19t19.5 8h200v-760q0 -11 -7 -20t-17 -9h-203zM682 1018v141 q0 12 7.5 20.5t17.5 8.5h202v-141q0 -11 -7 -20t-17 -9h-203zM987 106v762q0 11 7.5 19t19.5 8h590v-1032q0 -11 -8 -19t-19 -8h-590l2 141q0 11 7.5 20t17.5 9h360v100h-387zM1212 276h138q10 0 17 8.5t7 20.5v422h-137q-10 0 -17.5 -9t-7.5 -20v-422zM1681 -23 q0 11 7.5 20t19.5 9h360v100h-387v762q0 11 7.5 19t19.5 8h588v-1032q0 -11 -7.5 -19t-17.5 -8h-590v141zM1905 276h137q12 0 19 8.5t7 20.5v422h-137q-11 0 -18.5 -9t-7.5 -20v-422z" />
447-<glyph unicode="&#xe01b;" d="M0 674q0 151 105.5 256.5t254.5 105.5q129 0 234 -88l733 367q0 4 -1 11t-1 11q0 149 106 255t257 106q149 0 254.5 -106t105.5 -255q0 -151 -105.5 -256.5t-254.5 -105.5q-132 0 -234 86l-733 -367q0 -3 1 -9.5t1 -10.5q0 -3 -1 -10.5t-1 -10.5l733 -366q102 86 234 86 q149 0 254.5 -106t105.5 -255q0 -151 -105.5 -256.5t-254.5 -105.5q-151 0 -257 105.5t-106 256.5q0 3 1 10t1 11l-733 366q-102 -86 -234 -86q-149 0 -254.5 106t-105.5 255z" />
448-<glyph unicode="&#xe01c;" d="M0 653q0 208 81 397.5t218.5 327t327 218.5t397.5 81t397.5 -81t327 -218.5t218.5 -327t81 -397.5q0 -207 -78.5 -394t-218.5 -327q-122 149 -297.5 233.5t-374.5 84.5q-220 0 -408 -101.5t-309 -275.5q-169 144 -265.5 347t-96.5 433zM336 948q0 -36 25 -61t61 -25 q12 0 18 2q294 119 611 119q316 0 610 -119q3 0 9 -1t9 -1q35 0 60.5 25.5t25.5 60.5q0 53 -47 76q-326 129 -667 129q-348 0 -674 -131q-41 -26 -41 -74zM430 643l12 -33q16 -26 47 -26q7 0 19 4q258 112 543 112q287 0 546 -114q8 -4 15 -4q31 0 47 26l10 35q0 26 -20 43 q-282 127 -598 127q-315 0 -600 -127q-21 -21 -21 -43zM528 348q11 -28 33 -34.5t31 1.5q221 105 459 105q228 0 448 -98q51 -26 72 24q10 26 0 47t-29 31q-215 108 -491 108q-264 0 -500 -112q-13 -7 -22.5 -25.5t-0.5 -46.5zM653 -301q75 99 186.5 156t239.5 57 q114 0 217 -47t179 -129q-212 -107 -451 -107q-192 0 -371 70z" />
449-<glyph unicode="&#xe01d;" horiz-adv-x="2467" d="M-10 662q0 87 49.5 161t128 115t164.5 41q128 0 219 -74h2q281 168 686 168l4 4l148 553l501 -76q2 1 4 4l2 3q12 18 13 20q25 35 31 41q71 68 176 68t176 -69.5t71 -174.5t-71 -179.5t-176 -74.5q-119 0 -183 79t-67 197q-13 2 -42 6t-75.5 11.5t-75.5 11.5 q-212 30 -221 31q-11 -32 -59 -211q-51 -174 -66 -242l2 -2q149 -2 305 -43t269 -119q52 38 73.5 52t63 27.5t90.5 13.5q145 0 245.5 -101.5t100.5 -247.5q0 -97 -54 -179.5t-143 -125.5q-1 -93 -32.5 -177.5t-82 -149t-122 -122.5t-144 -98.5t-157.5 -76.5q-6 -2 -49 -21.5 t-66 -26.5q-68 -20 -189.5 -38.5t-191.5 -18.5q-247 0 -477 74q-26 18 -80.5 44t-68.5 34q-71 38 -129.5 76.5t-116.5 91t-97.5 108.5t-65 128t-26.5 151h-2q-72 38 -127 106l-18 25q-31 57 -40 95.5t-9 107.5zM80 637q0 -121 98 -209q17 116 100.5 226.5t194.5 197.5 q-64 43 -149 43q-97 0 -170.5 -80t-73.5 -178zM289 338q0 -87 41 -169.5t108 -146.5t152 -117t172 -86.5t170 -49.5q158 -29 297 -29q244 0 461.5 76t369.5 235h-2q69 91 97 153t28 146q0 86 -35.5 167.5t-94 144.5t-135 116.5t-157 89.5t-162.5 58q-169 47 -366 47 q-119 0 -244 -22t-251.5 -72t-225.5 -121.5t-161 -180.5t-62 -239zM649 487q0 80 49.5 129.5t128.5 49.5t134 -49.5t55 -129.5q0 -77 -56.5 -129.5t-132.5 -52.5q-77 0 -127.5 52.5t-50.5 129.5zM719 162h108q53 -93 162 -141t225 -48q118 0 222.5 48t171.5 141h104 q-30 -72 -86.5 -129t-125.5 -90.5t-142 -50.5t-144 -17q-69 0 -142 17.5t-143 51t-126.5 90.5t-83.5 128zM1411 487q0 82 50.5 130.5t131.5 48.5q75 0 127 -52t52 -127q0 -74 -52.5 -128t-126.5 -54q-79 0 -130.5 51.5t-51.5 130.5zM1954 1446q0 -68 47.5 -116t116.5 -48 q70 0 113.5 46.5t43.5 117.5q0 66 -45.5 112t-111.5 46q-65 0 -114.5 -47t-49.5 -111zM1991 870q107 -74 185.5 -183t111.5 -234q104 85 104 180q0 115 -70 197.5t-182 82.5q-81 0 -149 -43z" />
450-<glyph unicode="&#xe01e;" horiz-adv-x="1570" d="M4 55q0 40 25 131q48 178 177.5 323.5t301.5 211.5q-76 61 -119 147.5t-43 182.5q0 116 59 213.5t158.5 153t214.5 55.5t214.5 -55.5t158.5 -153t59 -213.5q0 -96 -41.5 -181.5t-115.5 -146.5q217 -78 362.5 -260.5t145.5 -405.5q0 -85 -36 -144t-114 -73q-6 -19 -27 -53 q-8 -24 -30.5 -44.5t-57 -35t-69 -25t-81 -19t-77 -13t-73.5 -10t-56 -7.5q-4 0 -14.5 -2t-14.5 -2h-245q-103 0 -263.5 34.5t-183.5 90.5q-36 36 -51 86q-48 10 -86 43q-42 17 -60 66.5t-18 105.5z" />
451-<glyph unicode="&#xe01f;" horiz-adv-x="1581" d="M8 631v211q0 90 52.5 204t132 215.5t171 187.5t171.5 130q160 90 383 90q71 0 143.5 -12.5t145.5 -41.5t129 -71t91 -107.5t35 -144.5q0 -26 -4 -50t-14.5 -49t-18.5 -43t-28 -43.5t-29 -38t-35 -39t-34.5 -34.5t-38.5 -36t-35 -33h108h236q4 -148 4 -221q0 -108 -5 -218 t-25.5 -250t-55.5 -200q-71 -124 -193.5 -221t-261.5 -144q-81 -30 -114 -30h-173q-7 0 -98 34q-124 55 -185 140.5t-61 216.5q0 7 1 21.5t1 21.5q-275 142 -368 440q-27 91 -27 115zM307 897q0 -82 19.5 -166t58 -162t107.5 -127t157 -49q25 0 81 31t101 31q29 0 105 -22 t76 -40q0 -26 -13.5 -34.5t-40.5 -8.5q-51 0 -88.5 -4.5t-82.5 -18.5t-70 -47.5t-25 -84.5q0 -81 43.5 -137t108.5 -79.5t145 -23.5q96 0 188.5 34t149.5 101q53 62 69.5 144t16.5 192q0 38 -2 113t-2 112q0 98 10 164h-395q-2 -16 -2 -47q0 -24 2 -71t2 -70q0 -73 -16 -115 q-10 -2 -35 -2q-60 0 -109 25.5t-80 66t-52 94t-29.5 107.5t-8.5 108q0 52 8.5 108t29 115.5t50 106.5t77.5 77t106 30q19 0 43 -7q-9 -52 -9 -69q0 -71 39.5 -118.5t108.5 -47.5q70 0 117 47.5t47 118.5q0 64 -36.5 114t-93.5 78t-118.5 42t-120.5 14q-181 0 -326 -78 t-228 -221t-83 -324z" />
452-<glyph unicode="&#xe020;" horiz-adv-x="1761" d="M2 739.5q-15 -169.5 38 -368t171 -377.5q38 -58 71.5 -100.5t78.5 -87t96.5 -68.5t105.5 -25q45 -1 87 12.5t72.5 30t82.5 30t113 13.5q61 1 112.5 -12.5t81 -30t71 -30t85.5 -13.5q54 1 106 27t99.5 75t80.5 91.5t74 103.5q64 98 133 248q-85 32 -149.5 93.5t-99 135 t-42 158t14 163t77 149t138.5 116.5q-77 99 -181.5 154t-211.5 55q-78 0 -149 -22t-131 -44t-112 -22q-54 0 -119 22t-136 44t-138 22q-118 0 -234.5 -69t-195.5 -189q-75 -115 -90 -284.5zM852 1268q-16 85 14 170t88 155q56 68 143 115t169 53q13 -89 -15.5 -175 t-83.5 -156q-56 -72 -142 -117.5t-173 -44.5z" />
453-<glyph unicode="&#xe021;" horiz-adv-x="2039" d="M0 276v756q0 175 87 324t236 236t324 87h453q134 -16 284 -116.5t213 -235.5q3 -6 10.5 -20t10 -19.5t8 -19t8 -25.5t7 -32t8.5 -45.5t8 -59.5q5 -44 7.5 -59t8.5 -43.5t15 -44t22 -27.5q22 -20 83.5 -24.5t121 -6.5t74.5 -14l28 -23l17 -35l6 -28l-4 -525 q-1 -174 -87.5 -322.5t-235 -235.5t-322.5 -87h-744q-175 0 -324 87t-236 235.5t-87 322.5zM530 287q0 -51 36.5 -87t88.5 -36h729q51 0 87 36t36 87t-36 87t-87 36h-729q-52 0 -88.5 -36t-36.5 -87zM530 1028q0 -51 36.5 -88t88.5 -37h359q51 0 87 37t36 88t-36 87t-87 36 h-359q-52 0 -88.5 -36t-36.5 -87z" />
454-<glyph unicode="&#xe022;" d="M0 655q0 201 78 392q74 182 225 333q296 299 719 299q429 0 731 -299q147 -147 219 -331q76 -183 76 -394q0 -210 -74 -393q-72 -181 -219 -325q-153 -150 -340 -228q-194 -78 -393 -78q-198 0 -389 78q-183 76 -332 225t-225 332t-76 389zM184 655q0 -160 66 -317 q65 -154 186 -272q123 -123 273 -183q147 -63 317 -63q168 0 320 63q150 63 278 185q240 234 240 587q0 173 -64 322q-62 155 -180 270q-245 248 -594 248q-350 0 -590 -246q-120 -120 -186 -274q-66 -157 -66 -320zM440 655q0 146 86 232q83 86 215 86q190 0 273 -148 l-137 -71q-22 48 -56 63q-32 19 -59 19q-137 0 -137 -181q0 -82 34 -131q37 -49 103 -49q89 0 127 86l127 -63q-44 -74 -113 -117q-70 -43 -158 -43q-137 0 -221 84t-84 233zM1032 655q0 146 86 232t215 86q191 0 271 -148l-136 -71q-21 47 -53 63q-36 19 -61 19 q-137 0 -137 -181q0 -86 34 -131q34 -49 103 -49q87 0 125 86l129 -63q-45 -75 -115 -117q-70 -43 -154 -43q-142 0 -223 84q-84 84 -84 233z" />
455-<glyph unicode="&#xe023;" d="M0 655q0 208 81 397.5t218.5 327t327 218.5t397.5 81t397.5 -81t327 -218.5t218.5 -327t81 -397.5t-81 -397.5t-218.5 -327t-327 -218.5t-397.5 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM170 655q0 -154 56 -299.5t159 -263.5q99 192 311.5 366.5t415.5 219.5 q-24 57 -59 129q-353 -113 -762 -113q-80 0 -119 2q0 -7 -1 -20.5t-1 -20.5zM197 866q45 -4 133 -4q341 0 649 92q-155 276 -342 461q-163 -83 -278.5 -227.5t-161.5 -321.5zM502 -18q111 -87 246.5 -134t275.5 -47q151 0 301 58q-41 353 -160 678q-188 -40 -379.5 -206 t-283.5 -349zM815 1481q182 -188 334 -465q280 118 420 297q-115 95 -255.5 145.5t-289.5 50.5q-103 0 -209 -28zM1223 870q17 -36 69 -165q153 14 330 14q126 0 252 -6q-7 135 -59.5 263t-141.5 232q-132 -198 -450 -338zM1343 561q104 -302 142 -622q162 105 263.5 268 t123.5 354q-150 10 -273 10q-113 0 -256 -10z" />
456-<glyph unicode="&#xe024;" horiz-adv-x="1714" d="M0 1047q0 80 31 118q20 30 53 43q40 19 96 19h193q31 0 53.5 22.5t22.5 53.5q-1 43 -3 90v120q0 50 25 91q30 44 102 63q27 8 83.5 11.5t133.5 -4t132 -29.5q34 -14 60 -49.5t32 -77.5q169 5 280 -9q196 -23 265 -49q38 -12 67.5 -46t40.5 -91q21 -111 37.5 -429 t3.5 -448q-33 -350 -88 -520q-28 -87 -57 -141.5t-56 -86.5t-74.5 -46t-87.5 -17.5t-120 -3.5q-114 0 -181 10t-113.5 40.5t-63.5 82.5t-17 138q0 74 14 123.5t40.5 76t65.5 39t89.5 13.5t111.5 0q8 0 11 -3t1 -10.5t-5 -16t-6 -22t-3 -26.5t2 -26l3 -19.5t1.5 -12.5t-3 -8 t-11.5 -2h-19h-21.5t-20 -0.5t-20.5 -2.5t-17.5 -5.5t-16 -8.5t-11.5 -12.5t-8.5 -18t-2.5 -23.5q0 -20 3.5 -35t8 -25.5t16.5 -17t21 -10t31 -5t36 -2t45 -0.5h11q116 0 149 27.5t33 130.5q0 66 -8 114.5t-20.5 77t-33 46.5t-41 25t-50.5 11q-176 18 -244 41 q-111 41 -109 236v8q0 5 -5 5t-5 -5q0 -138 -37 -246l-16 -49q-9 -19 -21.5 -30.5t-23.5 -17t-32.5 -5.5t-34 1.5t-42.5 7t-45 7.5q-86 10 -213.5 39.5t-191.5 57.5q-30 13 -45 30t-31 52q-35 73 -73.5 264.5t-47.5 271.5q-8 68 -8 105zM12 1290v4l375 369q0 2 2 2l-6 -12 q-23 -44 -23 -99q0 -45 2 -211q0 -8 -5.5 -14t-14.5 -6h-190q-67 0 -121 -23q-11 -6 -19 -10zM1176 696q44 6 94 6q92 -3 166 -36q0 173 -125 178q-35 1 -61 -11.5t-40.5 -36t-22.5 -47.5t-11 -53z" />
457-<glyph unicode="&#xe025;" horiz-adv-x="2156" d="M0 635q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362zM1130 635q0 212 150 362t362 150t362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362z" />
458-<glyph unicode="&#xe026;" horiz-adv-x="1323" d="M0 -2q0 86 48.5 169t130.5 146.5t199 102.5t245 39h110q-86 82 -86 176q0 58 33 119q-20 -2 -59 -2q-213 0 -348.5 132.5t-135.5 327.5q0 122 78.5 230t205.5 171.5t267 63.5h635l-141 -102h-201q96 -37 150.5 -139.5t54.5 -227.5q0 -96 -49 -181.5t-131 -150.5 q-75 -59 -98 -93.5t-23 -86.5q0 -39 55 -98.5t111 -99.5q124 -88 172.5 -180t48.5 -232q0 -87 -42 -168t-118.5 -146t-197 -104t-265.5 -39q-177 0 -324 44.5t-236 131t-89 197.5zM229 66q0 -140 119.5 -240t298.5 -100q243 0 353 89.5t110 239.5q0 39 -8 66 q-6 22 -14.5 41.5t-25.5 39t-28 32.5t-39.5 34.5t-41.5 30.5t-52 35.5t-53 36.5q-81 24 -158 24q-120 1 -226.5 -43t-170.5 -120.5t-64 -165.5zM365 1210q22 -161 123.5 -277.5t224.5 -119.5q80 -3 141 46.5t88.5 138t13.5 194.5q-22 161 -122.5 274.5t-223.5 116.5 q-123 4 -194 -104.5t-51 -268.5z" />
459-<glyph unicode="&#xe027;" horiz-adv-x="1798" d="M0 397q0 -299 207 -526q205 -225 532 -225q325 0 531 225q207 223 207 526q0 160 -56 299q-81 -50 -174 -69q45 -105 45 -234q0 -157 -73 -291q-76 -133 -203 -206q-127 -74 -277 -74q-151 0 -278 74q-130 76 -201 206q-76 134 -76 291q0 241 164 414q164 170 391 170 q106 0 201 -39q8 83 55 176q-116 43 -256 43q-327 0 -544 -242q-195 -219 -195 -518zM573 -121q24 -4 52.5 -6t45.5 -2h17q151 95 254.5 222.5t148.5 254.5t64 259t8 245t-26.5 202t-32.5 140l-17 51q-44 140 -88 244t-66 138l-22 34q59 -31 100.5 -69.5t60.5 -75.5t28 -75 t6.5 -69.5t-7 -56.5t-10.5 -39l-6 -14q14 -192 6 -352t-34.5 -289t-64.5 -231.5t-83.5 -180t-92 -134.5t-90 -94.5t-77 -60t-53.5 -32.5zM1139.5 1115q-9.5 58 2.5 101t29 78t33 54l17 18q25 28 80.5 54t98.5 38l42 12q46 10 89 36.5t71 57.5t50 61t32 49l10 20 q52 -72 78 -159.5t26.5 -161t-6 -137t-16.5 -100.5l-11 -36q-16 -43 -40 -81t-46.5 -62.5t-42.5 -43t-32 -26.5l-13 -8q-49 -29 -102 -37.5t-122.5 15.5t-135.5 89q86 47 157 96t115 89.5t77.5 79t49.5 67t25.5 50t11.5 32.5l2 12q-36 -81 -99 -149.5t-127.5 -107.5 t-123.5 -66.5t-96 -37.5l-37 -10q-37 56 -46.5 114z" />
460-<glyph unicode="&#xe028;" horiz-adv-x="997" d="M-4 -303q208 12 266 55q62 44 62 219v1364q0 167 -62 217q-58 49 -266 58v57h1001v-57q-207 -9 -268 -58t-61 -217v-1364q0 -176 61 -219t268 -55v-57h-1001v57z" />
461-<glyph unicode="&#xe029;" horiz-adv-x="2527" d="M0 297q0 162 98 345.5t279 365.5q118 117 244.5 203.5t237.5 129.5t203.5 42t143.5 -52q91 -91 29 -295q-9 -29 6 -36t34 0l19 8q197 81 348 81.5t218 -85.5q63 -90 -2 -252q-12 -32 -2 -43.5t42 -20.5q58 -18 110 -47t98 -71t73 -101t27 -127q0 -79 -37.5 -163 t-106 -163.5t-171.5 -150.5t-227 -124.5t-280 -84.5t-323 -31q-158 0 -311.5 29.5t-288.5 87.5t-238 137.5t-163 187.5t-60 230zM256 199q13 -136 125.5 -240.5t293.5 -154t388 -29.5q154 15 290.5 68.5t231.5 130.5t146 175t41 199q-14 135 -127 239.5t-293.5 153.5 t-386.5 29q-207 -20 -375 -103.5t-258 -208t-76 -259.5zM559.5 200.5q1.5 69.5 34.5 135.5q42 87 126 147.5t182.5 79.5t201.5 -4q102 -26 169.5 -95t82 -156.5t-24.5 -184.5q-42 -96 -131.5 -161.5t-194.5 -82t-214 14.5q-74 23 -127.5 70.5t-79.5 107t-24.5 129z M698.5 110q12.5 -49 61.5 -71q50 -23 105.5 -5t86.5 68q30 47 16 96.5t-63 69.5q-50 21 -104.5 3t-83.5 -66q-31 -46 -18.5 -95zM988 271.5q6 -18.5 26 -25.5q19 -8 40 -0.5t31 26.5q11 19 5 38t-25 26q-19 6 -40.5 -1.5t-31.5 -25.5q-11 -19 -5 -37.5zM1645 1544 q-9 38 13 72t60 43q173 36 344 -17.5t293 -189.5q123 -136 159.5 -313.5t-17.5 -339.5v-2q-12 -37 -48.5 -55.5t-74.5 -6.5t-56 48t-6 73v2q39 115 13 242t-113 223q-88 97 -209.5 134.5t-243.5 10.5q-40 -8 -73.5 14t-40.5 62zM1726 1223q-7 34 11.5 63t52.5 37 q85 18 168 -8t143 -92q59 -67 77 -154t-9 -166q-10 -32 -41.5 -48t-63.5 -5q-33 10 -48.5 40.5t-4.5 63.5q27 91 -35 156q-60 69 -151 49q-33 -7 -62 12t-37 52z" />
462-<glyph unicode="&#xe02a;" horiz-adv-x="2224" d="M0 -373v2048h526v-760h469q101 146 289.5 417.5t237.5 342.5h585l-671 -977q0 -25 197 -293t394 -523l197 -255h-702q-98 136 -293 409.5t-293 409.5h-410v-819h-526z" />
463-<glyph unicode="&#xe02b;" horiz-adv-x="2129" d="M-10 1432q0 101 71.5 168t186.5 67t183.5 -66.5t70.5 -168.5t-69 -170t-189 -68h-2q-112 0 -182 68t-70 170zM16 -360v1368h455v-1368h-455zM723 -360h455v763q0 72 16 111q28 71 86.5 118.5t146.5 47.5q118 0 174 -82t56 -227v-731h454v784q0 154 -39 273t-110 193 t-165 112t-208 38q-86 0 -156 -21t-119 -58.5t-78.5 -71t-57.5 -76.5v-4h-2l2 4v195h-455q6 -131 0 -1368z" />
464-<glyph unicode="&#xe02c;" horiz-adv-x="2760" d="M0 565q0 71 4 215q53 17 98 17h37q34 -48 81.5 -144t64.5 -125q4 17 16.5 74.5t20.5 86.5t22 75.5t32 82t40 64.5q75 -12 116 -8q49 -111 93.5 -333.5t79.5 -317.5q-2 0 -8 2t-7 2q-19 0 -52.5 -11.5t-45.5 -13.5q-81 206 -127 416q-24 -43 -27 -110t-4.5 -137 t-21.5 -115l-11 4q-16 0 -45 -4t-43 -4h-37q-60 107 -116 182q-6 -12 -6 -31q0 -18 5 -52t5 -52l-2 -25q-64 -31 -107 -31q-14 0 -20 2q-35 113 -35 291zM727 410q0 39 10 86t29 93.5t53.5 77.5t77.5 31q21 0 57.5 -10t46.5 -12q19 -87 19 -166q0 -58 -12 -113 q-25 9 -78.5 10.5t-75.5 6.5q-10 -42 -10 -76q0 -42 20.5 -75.5t61.5 -33.5q18 0 53 10.5t53 10.5q34 0 47 -29q-87 -33 -168 -33q-95 0 -139.5 62t-44.5 160zM846 467l16 2q5 0 15.5 -4t15.5 -4l14 6q4 28 4 45q0 37 -10 82q-45 -51 -55 -127zM1071 356q0 252 160 373 q67 -6 123 -47q-1 -36 -16.5 -139t-10.5 -160q-40 -4 -59 -4q-16 0 -88 10q-11 -26 -11 -47q0 -45 35.5 -77t79.5 -32q54 0 84 48q36 -12 43 -35q-46 -43 -129 -43q-47 0 -94 16t-82 52t-35 85zM1186 444q7 -12 28 -12h19q18 40 18 100q0 26 -12 80q-6 -17 -20.5 -51.5 t-23 -62.5t-9.5 -54zM1389 483q-3 54 47 54q13 0 36.5 -2.5t34.5 -2.5q6 30 6 64q0 60 -15 177t-15 177q0 89 20 148q18 -10 41 -9.5t45 -9t51 -43.5q-12 -54 -12 -137q0 -41 8 -166t2 -194h13q12 -1 17 7t4.5 18t1 18t7.5 8q16 0 37.5 -17.5t46 -44t31.5 -32.5 q-18 -14 -83.5 -18.5t-78.5 -8.5q-2 -25 -2 -74q0 -32 1 -67.5t2.5 -78.5t2.5 -67q-16 -2 -46.5 -4t-45.5 -4v21q1 49 -6 138t-8 124q-13 3 -66 6t-77 20zM1829 500q0 40 4 118q22 -3 41 -10.5t43.5 -21t36.5 -19.5l-2 -55q0 -121 18 -238q31 11 53 37t33.5 58t17.5 72 t7.5 74t1.5 69v22q6 -2 18 -2q43 -4 101 -51q0 -6 1 -19.5t1 -19.5q0 -31 -8.5 -61t-15.5 -45t-29.5 -51.5t-28.5 -47.5q-34 -27 -70 -86q-44 -14 -78 -14q-145 0 -145 291zM2238 279q12 11 50 20q21 189 48 277q66 217 220 217q69 0 156 -50q34 -72 34 -153 q0 -135 -95.5 -243t-229.5 -140q-4 -66 -4 -98q0 -149 37 -240q-17 4 -76 4q-31 0 -45 4q-18 45 -26 129.5t-21 158.5t-48 114zM2423 330q80 21 134 98t54 162q0 61 -31 115q-36 -33 -63 -77t-45 -100.5t-27 -94.5t-22 -103z" />
465-<glyph unicode="&#xe02d;" horiz-adv-x="2037" d="M0 291q0 59 40 99t99 40q57 0 97 -40.5t40 -98.5q0 -57 -40 -98t-97 -41q-58 0 -98.5 41t-40.5 98zM0 1018q0 57 40.5 98t98.5 41q57 0 97 -41t40 -98t-40 -98t-97 -41q-58 0 -98.5 41t-40.5 98zM399 459q0 58 40.5 98.5t97.5 40.5q59 0 99 -40t40 -99q0 -57 -40.5 -97 t-98.5 -40q-57 0 -97.5 40t-40.5 97zM399 860q0 58 40.5 98.5t97.5 40.5q59 0 99 -40.5t40 -98.5q0 -57 -40.5 -97t-98.5 -40q-57 0 -97.5 40t-40.5 97zM518 -229q0 57 40.5 97t98.5 40q57 0 98.5 -40t41.5 -97q0 -58 -41.5 -99t-98.5 -41q-58 0 -98.5 40.5t-40.5 99.5z M518 1540q0 58 40 98.5t99 40.5q57 0 98.5 -40.5t41.5 -98.5q0 -57 -41.5 -97t-98.5 -40q-58 0 -98.5 40t-40.5 97zM676 182q0 57 40.5 98.5t98.5 41.5q57 0 97 -41.5t40 -98.5q0 -58 -40 -98.5t-97 -40.5q-59 0 -99 40.5t-40 98.5zM676 1139q0 57 40.5 98t98.5 41 q57 0 97 -41t40 -98q0 -58 -40 -99t-97 -41q-58 0 -98.5 40.5t-40.5 99.5zM1073 182q0 57 41 98.5t98 41.5t98.5 -41.5t41.5 -98.5q0 -58 -41.5 -98.5t-98.5 -40.5t-98 40.5t-41 98.5zM1073 1139q0 57 41 98t98 41t98.5 -41t41.5 -98q0 -58 -41.5 -99t-98.5 -41t-98 41 t-41 99zM1233 1540q0 58 40.5 98.5t98.5 40.5q57 0 97 -40.5t40 -98.5q0 -57 -40 -97t-97 -40q-58 0 -98.5 40t-40.5 97zM1249 -229q0 57 41 97t99 40q57 0 97 -40t40 -97q0 -58 -40 -99t-97 -41q-59 0 -99.5 40.5t-40.5 99.5zM1352 459q0 58 40 98.5t97 40.5q59 0 99 -40 t40 -99q0 -57 -40.5 -97t-98.5 -40q-57 0 -97 40t-40 97zM1352 860q0 58 40 98.5t97 40.5q59 0 99 -40.5t40 -98.5q0 -57 -40.5 -97t-98.5 -40q-57 0 -97 40t-40 97zM1761 291q0 58 40 98.5t97 40.5q59 0 99.5 -40.5t40.5 -98.5q0 -57 -41 -98t-99 -41q-57 0 -97 41t-40 98z M1761 1018q0 57 40 98t97 41q58 0 99 -41t41 -98t-41 -98t-99 -41q-57 0 -97 41t-40 98z" />
466-<glyph unicode="&#xe02e;" horiz-adv-x="1744" d="M2.5 588q-7.5 98 4 232.5t50.5 250.5q5 14 14 37.5t44 90.5t76.5 127t112 132t149.5 121.5t190.5 78.5t233.5 19q176 0 323.5 -60t246.5 -158.5t167.5 -228.5t99.5 -267t31 -277q0 -163 -27.5 -305t-76.5 -247.5t-103.5 -181.5t-120.5 -136q-114 -102 -249.5 -140 t-319.5 -43q-57 -2 -122 9t-139.5 36t-148 71t-141 107.5t-125.5 152t-96 198.5q-6 18 -16 51t-30 132.5t-27.5 197.5zM460 386.5q7 -111.5 15 -162t14 -64.5q12 -98 39 -175.5t61 -123.5t72 -79t74 -46.5t65 -20.5t46 -7l18 1q90 2 156.5 32.5t110.5 83.5t74 139t46 183.5 t27 233.5q7 288 1 464t-17 253l-11 76q-14 61 -26.5 105.5t-33.5 97.5t-48.5 89.5t-65.5 68.5t-90 48t-117 16q-49 7 -93 -3.5t-77 -33.5t-62 -54.5t-49.5 -68t-37.5 -73.5t-27 -71t-17 -60.5t-10 -42.5l-3 -16q-13 -94 -20.5 -225t-9.5 -215l-1 -85q-10 -153 -3 -264.5z " />
467-<glyph unicode="&#xe02f;" horiz-adv-x="2148" d="M0 424q19 285 344 354q15 108 43 231.5t80 262t111 198.5q98 101 245.5 155t298.5 54q175 0 335.5 -79.5t240.5 -225.5q39 -74 84.5 -268t62.5 -315q33 -13 70 -13q32 0 46.5 14t14.5 46q0 23 -12 69t-10 72v8q37 2 85 -51t79.5 -117.5t31.5 -101.5q0 -40 -19 -72 t-39.5 -50t-66.5 -35.5t-66.5 -22.5t-73.5 -17q-11 -3 -17 -4q12 -396 -158 -571l51 -51q9 -5 52 -24.5t72 -38t38 -36.5q-133 -104 -270 -104q-68 0 -154 35q-181 -76 -369 -76q-243 0 -479 125q-70 -15 -112 -39q-13 -8 -54.5 -37.5t-75.5 -48.5t-57 -19q-6 37 -6 76 q0 161 109 258q-123 203 -127 527l-15 2q-64 1 -161 -36.5t-132 -37.5q-8 0 -20 4zM475 233q0 -3 6 -27.5t8 -27.5q24 -83 72.5 -161.5t110.5 -120.5q88 -60 216.5 -96t239.5 -36q135 0 298 58t245 147q139 149 139 527q0 206 -46.5 412.5t-141.5 363.5q-37 60 -56 77 q-33 27 -85 27q-102 0 -219 -125q-157 97 -287 97q-77 0 -143 -35t-114 -96.5t-87.5 -140t-65 -171.5t-44 -184t-28 -185t-14 -166.5t-4.5 -136.5zM846 1067q0 44 31.5 76.5t74.5 32.5q44 0 76.5 -32.5t32.5 -76.5t-32 -75t-77 -31q-43 0 -74.5 31t-31.5 75zM961 1104 q0 -9 7 -17t17 -8q9 0 17 8t8 17q0 10 -8 18t-17 8q-10 0 -17 -7.5t-7 -18.5zM1153 981l4 4l-2 -6zM1163 991l107 107l104 -107q-46 -14 -102 -14q-60 0 -109 14zM1167 946q55 -10 103 -10q45 0 100 10l-100 -100zM1382 979v6l2 -4zM1438 1067q0 44 32 76.5t76 32.5 t76.5 -32.5t32.5 -76.5t-32 -75t-77 -31q-44 0 -76 31t-32 75zM1552 1104q0 -9 8 -17t17 -8q10 0 18.5 8t8.5 17q0 10 -8 18t-19 8q-9 0 -17 -8t-8 -18z" />
468-<glyph unicode="&#xe030;" horiz-adv-x="1779" d="M6 -334v1960q246 43 608 43q286 0 482.5 -49.5t339.5 -157.5q338 -257 338 -757q0 -274 -89 -477.5t-241 -331.5q-303 -258 -924 -258q-292 0 -514 28zM457 -2q39 -8 157 -8q209 -1 360 73t236.5 232.5t85.5 392.5q0 316 -167 475.5t-467 159.5q-135 0 -205 -18v-1307z " />
469-<glyph unicode="&#xe031;" d="M0 -94q0 112 80 192t192 80q114 0 193.5 -79.5t79.5 -192.5q0 -114 -79.5 -193.5t-193.5 -79.5q-113 0 -192.5 79.5t-79.5 193.5zM0 592v391q183 0 358.5 -48.5t323.5 -136t273 -212.5t212.5 -273t136 -323.5t48.5 -358.5h-394q0 192 -72.5 367.5t-207.5 310.5 q-137 137 -311.5 210t-366.5 73zM0 1286v393q278 0 543 -74t489.5 -206t414 -321.5t321.5 -414t206 -489.5t74 -543h-393q0 225 -59.5 439.5t-166.5 396t-260 334t-334.5 259.5t-396 166.5t-438.5 59.5z" />
470-<glyph unicode="&#xe032;" horiz-adv-x="2019" d="M0 1120q0 114 44 217.5t119 178.5t178.5 119t217.5 44q159 0 297 -86q80 15 164 15q196 0 374.5 -76.5t308 -205.5t206 -307.5t76.5 -373.5q0 -95 -23 -207q57 -120 57 -248q0 -114 -44 -217.5t-119 -178.5t-178.5 -119t-217.5 -44q-138 0 -264 66q-91 -16 -176 -16 q-195 0 -373.5 76.5t-307.5 205.5t-205.5 307.5t-76.5 374.5q0 93 19 193q-76 133 -76 282zM453 371q0 -85 61 -174q146 -213 504 -213q81 0 158 13.5t151.5 44.5t130 77.5t89.5 118.5t34 161q0 80 -28 143.5t-75 104.5t-108 71.5t-128.5 49.5t-134.5 34.5t-128 30 t-108 32.5t-75 46t-28 66q0 36 24 63.5t61 41.5t73 21t69 7q60 0 105 -13.5t70 -35.5t43.5 -48t32.5 -52t30 -48t42.5 -35.5t63.5 -13.5q56 0 98 39t42 94q0 54 -31 111q-32 59 -86.5 102.5t-121.5 67t-133.5 34.5t-135.5 11q-74 0 -145 -11t-143 -38t-125.5 -68 t-87.5 -106.5t-34 -147.5q0 -78 27.5 -138.5t73.5 -98.5t105.5 -66.5t126 -46t132.5 -33t125.5 -31.5t105.5 -36t73.5 -53t27.5 -78q0 -46 -26.5 -80.5t-68.5 -53t-85 -27.5t-86 -9q-67 0 -116 16.5t-76.5 42.5t-47 57.5t-34 63.5t-31 58t-44 42.5t-67.5 16.5 q-58 0 -99.5 -35t-41.5 -92z" />
471-<glyph unicode="&#xe033;" horiz-adv-x="2519" d="M0 -178q62 -6 123 -6q360 0 643 221q-168 3 -300.5 102.5t-182.5 255.5q41 -8 96 -8q69 0 137 19q-180 36 -298 177.5t-118 327.5v7q110 -61 236 -64q-106 70 -169 184t-63 246q0 138 72 260q193 -238 470 -380.5t595 -159.5q-14 68 -14 118q0 140 69 259t188.5 188 t260.5 69q110 0 207.5 -43t169.5 -120q178 37 327 127q-28 -90 -86.5 -164.5t-138.5 -122.5q150 17 295 82q-101 -154 -256 -269v-67q0 -147 -31 -296.5t-94.5 -293.5t-153.5 -275t-214 -242t-269.5 -192t-327.5 -126.5t-380 -45.5q-427 0 -793 232z" />
472-<glyph unicode="&#xe034;" horiz-adv-x="1759" d="M-31 211q0 92 13 332q8 108 78 177t178 75q205 10 616 10t616 -10q108 -6 178 -75t78 -177q11 -204 11 -332q0 -129 -11 -332q-8 -108 -78 -177t-178 -75q-205 -10 -616 -10t-616 10q-108 6 -178 75t-78 177q-13 241 -13 332zM106 500h125v-668h121v668h125v112h-371 v-112zM240 1735h122l78 -312h9l73 312h123l-94 -303q-6 -21 -16.5 -50t-18 -53t-12.5 -51v-324h-121q0 3 1 85.5t1 150t-2 74.5q-4 28 -11.5 52.5t-18.5 53.5t-17 51zM477 -78q0 -98 74 -98q65 0 125 72v-64h106v576h-106v-439q-43 -43 -64 -43q-28 0 -28 39v443h-107v-486z M639 1100v299q0 69 45 107t115 38q67 0 109 -41t42 -108v-297q0 -74 -41 -116t-114 -42q-72 0 -114 44t-42 116zM750 1085q0 -21 12 -34t33 -13q23 0 35 14t12 38v313q0 20 -13.5 31.5t-33.5 11.5q-18 0 -31.5 -11.5t-13.5 -29.5v-320zM887 -168h108v43q42 -51 103 -51 q96 0 96 127v319q0 146 -104 146q-51 0 -95 -56v252h-108v-780zM995 -59v360q23 23 45 23q23 0 34 -17t11 -41v-303q0 -49 -38 -49q-29 0 -52 27zM1042 1044v486h107v-440q0 -39 29 -39q25 0 63 43v436h107v-576h-107v64q-60 -72 -125 -72q-74 0 -74 98zM1276 -6 q0 -79 39 -128.5t117 -49.5q159 0 159 178v43h-110q0 -4 1 -27.5t0 -34t-5 -27.5t-15 -24.5t-28 -7.5t-27.5 7t-14.5 21.5t-5 25t-1 28.5v108h205v148q0 77 -38 122.5t-115 45.5q-73 0 -117.5 -47.5t-44.5 -120.5v-260zM1386 197v61q0 64 48 64q47 0 47 -64v-61h-95z" />
473-<glyph unicode="&#xe035;" horiz-adv-x="2347" d="M0 1122q112 134 225.5 238t195.5 158t148 88.5t99 43.5l34 9q59 11 107 -4.5t81 -50.5t60.5 -91t44 -116.5t32 -136t25.5 -141t23.5 -140.5t26.5 -125q66 -258 105 -364.5t85 -106.5q49 0 136 114t192 310q33 62 45.5 123.5t4.5 109.5t-35.5 83t-68 50t-98 4.5 t-122.5 -49.5q39 228 219 384q149 130 335 160q184 30 307 -54q147 -101 139 -325q-1 -50 -11 -105q-27 -152 -90 -308.5t-143.5 -289t-179 -260.5t-193.5 -228.5t-190 -188t-165.5 -143t-122.5 -89.5q-63 -41 -129 -47.5t-120 15t-103.5 61t-84 85.5t-58.5 94 q-33 70 -120 354t-168.5 541.5t-109.5 290.5q-3 3 -8.5 7.5t-27 9.5t-49 0.5t-75 -28t-102.5 -67.5z" />
474-<glyph unicode="&#xe036;" horiz-adv-x="2525" d="M0 -150l215 760q71 41 175 64t172 26l69 2q102 0 213 -20q8 -2 22.5 -5t55 -14.5t76 -25t76 -35t65.5 -45.5l-213 -758q-75 56 -164 92t-141 44l-52 8q-71 6 -133 6q-12 0 -33 -0.5t-80 -6t-111.5 -15t-113 -30t-98.5 -47.5zM258 827l215 760q72 41 176 64t172 25l68 3 q104 0 213 -20q8 -2 22.5 -5t55 -14.5t76 -25t76 -35t65.5 -45.5l-213 -760q-75 56 -164 92t-141 44l-52 8q-71 6 -131 6q-12 0 -33 -0.5t-80.5 -6t-112 -14.5t-113.5 -29t-99 -47zM1141 -223l213 760q76 -56 165 -92t140 -44l51 -8q70 -6 133 -6q12 0 33 0.5t80.5 6 t112 14.5t112.5 28.5t98 46.5l-213 -759q-72 -41 -176 -64t-172 -26l-67 -3q-99 0 -213 21q-8 2 -22.5 5t-55.5 14.5t-76.5 25t-76.5 35t-66 45.5zM1386 750l213 757q76 -56 165 -92t140 -43l52 -8q70 -6 133 -6q12 0 33 0.5t80 6t111.5 14.5t113 28.5t98.5 46.5l-213 -758 q-72 -42 -176.5 -65.5t-173.5 -26.5l-68 -2q-102 0 -211 23q-23 4 -60 13t-117 41.5t-120 70.5z" />
475-<glyph unicode="&#xe037;" horiz-adv-x="1841" d="M-102 246h448l354 585l-266 469h-448l266 -469zM639 430l709 1245h475l-707 -1245l455 -803h-475z" />
476-<glyph unicode="&#xe038;" horiz-adv-x="2824" d="M0 1421l12 -39q7 -12 15 -20.5t12 -11.5l4 -2l39 -21h227l588 -704q23 -25 23 -52v-393q0 -16 -6 -24.5t-12 -9.5l-5 -1q-25 0 -151.5 -2.5t-139.5 -3.5q-20 0 -20 -18v-113h1056v117q-1 6 -5.5 9.5t-8.5 3.5l-4 1h-295q-2 0 -5 1t-8 8.5t-5 21.5v414q-2 5 3 13.5 t11 14.5l6 6q24 24 541 510h272q19 1 37 15l35 39q12 14 12 37v28q-2 5 -6 8t-7 3l-3 1h-893l-14 -12q-2 -13 2.5 -26t10.5 -20l5 -7l47 -47l37 -15h235l-423 -399l-467 596h84q27 -2 45 8l139 43l6 3t9.5 10t4.5 18v29q0 6 -4.5 9.5t-9.5 4.5h-4q-1 0 -79 0.5t-186 0.5 t-237.5 0.5t-238 0.5t-183.5 -0.5t-78 -1.5q-16 -2 -20 -14v-17zM2437 1645l379 -15l-170 -1161l-125 6zM2464 82l8 225l225 -8l-8 -225z" />
477-<glyph unicode="&#xe039;" horiz-adv-x="1781" d="M2 28q-14 46 86 115q13 31 33.5 72.5t33 67t13.5 32.5q1 3 6 28.5t13.5 65t19 87.5t26 106.5t31.5 110.5q26 84 63 153.5t59.5 97t35.5 37.5q11 9 13 13t-7 10q-7 5 -20.5 18t-35.5 45.5t-39 72.5t-26.5 103t-1.5 132q2 17 8 16q10 -1 19 -59v-2q3 -28 15 -64t32.5 -77 t55 -76t75.5 -52q3 -1 17 4.5t50.5 16.5t90 23.5t152 26t218.5 22.5q3 75 15 155q-14 10 -22.5 27.5t-10.5 29.5l-2 13q-10 -18 -18.5 -23.5t-22.5 -3.5q-12 1 -15 55t3 101q3 40 38.5 65t65.5 27q4 2 11 5t26.5 7.5t36.5 3.5q29 30 92 39.5t111 3.5l49 -6q43 5 80.5 1 t69.5 -14t55 -20t36 -18l13 -8q62 3 92 -55q14 -22 24.5 -52.5t15 -68.5t-11.5 -64l-5 -1q-10 5 -23 36q-7 -24 -18.5 -43.5t-18.5 -27.5l-8 -7q1 -32 -2.5 -63t-12.5 -58t-14.5 -42.5t-16.5 -36.5l-10 -21q-7 -16 5 -43q12 -32 46 -176t31 -201q-3 -63 -30 -133.5 t-56 -99.5q8 -70 -43 -168q-13 -23 -35 -91t-30 -108q-20 -104 -2 -127q2 -3 20 -25.5t29.5 -41.5t9.5 -31q-3 -19 -33.5 -38.5t-52.5 -19.5q-25 0 -56 14.5t-40 39.5q-9 27 -10.5 68t4.5 67q5 19 11.5 47.5t16.5 85t16 109.5t5 114t-12 105q-11 -5 -30.5 -12t-85 -18.5 t-134.5 -10.5q-12 -62 -27 -116.5t-24 -78.5l-9 -24q-10 -17 -10 -232q0 -84 29 -211q18 -13 27 -29t8 -26v-10q-4 -26 -32 -42t-61 -16q-34 0 -64 23t-30 57q0 7 3 102t1 144q-1 22 -2 55.5t-2 50.5t-3.5 39.5t-6.5 40.5q-53 202 -55 293q-15 0 -27 10q-28 -33 -55 -61.5 t-40 -40.5l-13 -12q2 -11 8 -32.5t10 -38t4 -21.5q0 -16 29 -29q24 -10 51.5 -31t26.5 -41q-2 -25 -48.5 -28.5t-93.5 18.5q-12 5 -80 217q-6 27 -7 32t5 28q34 98 31 131q-2 30 -46.5 66t-80.5 36q-11 0 -24.5 -5.5t-29.5 -17t-28 -21.5t-30.5 -25.5t-26.5 -22.5 q-31 -23 -77.5 -66t-49.5 -45q-11 -6 -76 -125t-84 -166q-1 -2 -4.5 -16t-7.5 -25t-10.5 -27.5t-16 -29t-22 -24.5t-30 -18t-38.5 -5q-35 2 -43 28z" />
478-<glyph unicode="&#xe03a;" horiz-adv-x="2045" d="M0 608q0 153 47 318.5t127 296.5q85 143 231.5 248t314 156.5t337.5 51.5q134 0 269 -46t249.5 -125.5t209.5 -184t157 -223.5q51 -87 76.5 -205.5t25.5 -232.5q0 -230 -85 -425.5t-232 -328t-347.5 -206t-427.5 -71.5q38 68 124.5 223t152.5 270.5t131 219.5l2 4 q7 11 24.5 38t25.5 40t19.5 35t18.5 42.5t12 43.5q13 54 13 98q0 162 -99 291l563 166q-583 0 -876 -2q-14 2 -45 2q-133 0 -243 -69.5t-167.5 -187t-42.5 -249.5q-4 18 -4 57q0 92 31 158l-418 412l406 -699q40 -147 162.5 -240.5t275.5 -93.5q27 0 67 7l-135 -566 q-120 0 -241.5 41t-226 111.5t-193 161t-154.5 192.5q-135 209 -135 471zM639 647q0 -157 111 -269t268 -112t268 112t111 269t-111 268t-268 111t-268 -111t-111 -268z" />
479-<glyph unicode="&#xe03b;" horiz-adv-x="1701" d="M0 -317q0 55 63 55q17 0 28 0.5t38 5t46.5 12.5t44.5 25.5t40.5 42t27 64t11.5 89.5v1258q0 55 -7.5 97.5t-26.5 83.5t-58 65.5t-96 29.5q-18 2 -30 7t-18 9t-9 15t-3 15.5v19.5q-4 51 47 51q9 0 127.5 -3t280 -6t276.5 -3q236 0 403.5 11t248 21.5t106.5 10.5 q35 0 49.5 -20t14.5 -44q0 -6 -12.5 -52.5t-12.5 -84.5q0 -32 7 -96t7 -90q0 -37 -24 -56.5t-49 -19.5q-21 0 -31.5 12t-11.5 45v24q4 17 0.5 34.5t-7 34.5t-21 33.5t-42 31t-70 26.5t-105.5 21t-148 14t-197 5q-100 0 -163 -5.5t-100 -14t-53.5 -29t-20 -39t-3.5 -56.5 q0 -59 1 -275t1 -237q0 -39 13 -54t46 -15h477q78 0 134.5 44.5t62.5 135.5q3 34 11 50t17 19t29 3q29 0 46.5 -23.5t13.5 -69.5q-1 -17 -10 -95t-9 -132q0 -50 9.5 -136.5t9.5 -117.5q0 -34 -23 -51t-49 -6.5t-35 45.5q-6 25 -8.5 35t-12.5 35.5t-20 38.5t-29.5 32.5 t-43 29.5t-59.5 17.5t-79 7.5h-424q-36 0 -52.5 -22t-16.5 -78v-543q0 -40 8 -70.5t29.5 -60.5t67.5 -46.5t114 -16.5q20 0 87.5 -1t106 -0.5t106 2.5t115 9t102.5 18t98.5 30t76.5 44q48 38 69.5 94t41.5 166q6 31 42 36q43 7 70 -31q23 -31 21 -83q-2 -24 -34 -129 t-32 -153q0 -12 1.5 -43.5t1 -47.5t-4.5 -37t-16 -30.5t-31 -9.5q-16 0 -32.5 4.5t-34.5 10t-73 10t-140 4.5q-136 0 -660.5 -3.5t-583.5 -3.5q-38 0 -50.5 11.5t-12.5 38.5z" />
480-<glyph unicode="&#xe03c;" horiz-adv-x="2129" d="M4 100v1180q0 3 6 39l695 -594l-693 -666q-8 28 -8 41zM96 1401q15 6 35 6h1870q19 0 37 -6l-697 -596l-92 -74l-182 -149l-182 149l-92 74zM98 -20l699 669l270 -219l270 219l699 -669q-17 -7 -35 -7h-1870q-15 0 -33 7zM1430 725l692 594q6 -18 6 -39v-1180 q0 -20 -6 -41z" />
481-<glyph unicode="&#xe03d;" horiz-adv-x="2265" d="M0 424v309q0 22 14.5 36.5t36.5 14.5h543l-236 -411h-307q-22 0 -36.5 14.5t-14.5 36.5zM250 -76l135 -78zM271 13.5q-6 20.5 3 39.5l623 1082q10 19 30.5 24t39.5 -6l133 -76q20 -10 25.5 -31t-5.5 -40l-620 -1082q-10 -19 -31.5 -24t-40.5 6l-133 78q-18 9 -24 29.5z M901 373l236 411h137l192 -411h-565zM1060 1653q2 19 13 24q21 11 73 -63.5t146.5 -237.5t126.5 -215q57 -90 154.5 -268.5t184.5 -343.5t91 -172q22 -39 -4.5 -74t-62.5 -49q-3 -1 -13 -5.5t-13 -5.5t-11.5 -4t-12.5 -3t-12 -0.5t-14.5 1.5t-15.5 5t-19 8q-18 9 -71.5 110 t-119.5 247t-114 254.5t-84 193.5q-10 22 -28 62.5t-34.5 78t-37.5 85t-38.5 90t-34.5 86.5t-28 80t-17 66.5t-4 49.5zM1733 784h481q21 0 36 -15t15 -36v-309q0 -21 -15 -36t-36 -15h-272q-8 31 -17 47q-16 31 -49 94q-129 243 -143 270zM1759 136q6 22 27 32l76 39 q20 10 42 2.5t33 -27.5l64 -123q10 -22 4 -44.5t-25 -34.5l-55 -33q-20 -11 -43 -5.5t-35 25.5l-82 127q-12 20 -6 42zM1915 -176q-6 24 3 43t14 25.5t18 19.5l34 14q100 29 141 -61q35 -76 19 -234q-7 22 -44.5 39.5t-85.5 42t-72 58.5q-21 29 -27 53z" />
482-<glyph unicode="&#xe03e;" horiz-adv-x="2220" d="M-2 4v182v111v424h287v-424h1648v424h289v-424v-111v-182h-2224z" />
483-<glyph unicode="&#xe03f;" d="M0 610q0 217 81 413.5t218.5 339t327 226.5t397.5 84t397.5 -84t327 -226.5t218.5 -339t81 -413.5q0 -7 -1 -20.5t-1 -20.5q-7 209 -91 398t-220 325.5t-321.5 216.5t-389.5 80t-389.5 -80t-321.5 -216.5t-220 -325.5t-91 -398q0 7 -1 20.5t-1 20.5zM375 612 q0 183 87 338.5t236.5 245.5t325.5 90t325.5 -90t236.5 -245.5t87 -338.5q0 -7 -1 -20.5t-1 -20.5q-10 174 -98.5 319t-234 229.5t-314.5 84.5t-314.5 -84.5t-234 -229.5t-98.5 -319q0 7 -1 20.5t-1 20.5zM715 213q0 53 5.5 97t13.5 76.5t23.5 58t30 42t38 28.5t42.5 18 t49 9.5t51 4t56 0.5t56 -0.5t51 -4t49 -9.5t42.5 -18t38 -28.5t30 -42t23.5 -58t13.5 -76.5t5.5 -97q0 -159 -41.5 -294.5t-112.5 -214.5t-155 -79t-155 79t-112.5 214.5t-41.5 294.5zM811 786q0 91 62.5 156.5t150.5 65.5t150.5 -65.5t62.5 -156.5t-62.5 -156t-150.5 -65 t-150.5 65t-62.5 156z" />
484-<glyph unicode="&#xe040;" horiz-adv-x="2250" d="M2 89q11 15 33 3q243 -141 529 -219t585 -78q400 0 793 150q9 4 28.5 12t28.5 12q31 12 48.5 -12t-11.5 -45q-46 -34 -94 -62q-176 -105 -394 -162t-424 -57q-318 0 -603 111.5t-511 314.5q-19 17 -8 32zM618 674q0 142 70 241.5t191 151.5q113 48 272 68q54 7 180 16v35 v28v32.5t-1.5 28.5t-4.5 32.5t-8.5 26.5t-13.5 28q-21 29 -58.5 45t-77.5 16h-16q-67 -6 -116.5 -42.5t-63.5 -102.5q-7 -42 -41 -47l-236 29q-41 10 -32 51q18 95 67 166.5t118 113t144 62.5t160 26h51q99 0 198.5 -29.5t166.5 -90.5q19 -18 34.5 -37t26 -42t18.5 -41 t12.5 -46.5t7.5 -45t4 -50.5t1.5 -48.5t0 -53.5t-0.5 -52v-377q0 -53 15.5 -97.5t29 -64t47.5 -61.5q24 -40 -4 -62q-142 -124 -184 -159q-25 -19 -59 -5q-23 20 -40 36t-31 32.5t-22 27t-23 31.5t-24 33q-114 -123 -225 -155q-73 -21 -172 -21q-158 0 -259.5 97t-101.5 276 zM971 715q0 -79 39.5 -127.5t107.5 -48.5q6 0 18 2t15 2q85 22 133 110q23 39 34 85.5t12 74.5t1 94v51q-119 0 -180 -16q-180 -52 -180 -227zM1828.5 55.5q3.5 8.5 14.5 16.5q54 35 99 47q99 26 191.5 19.5t109.5 -29.5q8 -12 8 -37v-15q0 -72 -39 -169t-109 -156 q-15 -12 -26.5 -6.5t-5.5 22.5q101 236 67 281q-28 33 -196 20q-52 -6 -95 -12q-11 -1 -16.5 4.5t-2 14z" />
485-<glyph unicode="&#xe041;" horiz-adv-x="2371" d="M0 418v1261h432v-616q322 184 754 184q241 0 461 -64t378.5 -172t252.5 -257.5t94 -313.5q0 -132 -60 -255t-169.5 -222.5t-255.5 -174.5t-327 -116t-374 -41q-237 0 -453.5 62t-374.5 167.5t-254 251t-102 306.5h-2zM432 440q0 -147 101 -271t274.5 -195.5t378.5 -71.5 t378 71.5t274 195.5t101 271q0 146 -100.5 270t-274 196.5t-378.5 72.5t-378.5 -72.5t-274.5 -196.5t-101 -270zM686 440q0 -97 67 -179t182 -129.5t251 -47.5q135 0 249.5 47.5t181 129.5t66.5 179t-66.5 179t-181 130t-249.5 48q-136 0 -251 -48t-182 -130t-67 -179z" />
486-<glyph unicode="&#xe042;" horiz-adv-x="2267" d="M-4 514q0 140 68.5 259t186.5 188t257 69l2 -2q0 5 -1 14t-1 13q0 119 45.5 226.5t123 185t184 123.5t224.5 46q211 0 371 -135.5t197 -339.5h35q118 0 224.5 -46t184 -123.5t123 -185t45.5 -226.5q0 -158 -77 -292t-210 -212t-290 -78q-17 0 -25 2v-2h-1137h-18h-19h-10 v2q-201 11 -342 160t-141 354z" />
487-<glyph unicode="&#xe043;" horiz-adv-x="2074" d="M-25 586l439 334l-439 331l637 416l416 -356l426 356l619 -395l-406 -338l406 -348l-629 -379l-416 319l-416 -319zM412 72v116l192 -112l416 317l2 -2v-727zM422 924l602 -379l606 401l-602 346zM1022 -336l2 727l4 2l414 -317l205 123v-129z" />
488-<glyph unicode="&#xe044;" horiz-adv-x="2881" d="M0 371q0 45 4.5 79t19.5 72.5t40 66.5t69 54.5t105 43t148.5 26.5t197.5 10q175 0 303 -27q76 -16 119 -37v-329h-600q0 -33 1.5 -53.5t11 -53t27 -51t53 -33t85.5 -14.5q174 0 174 125h129h4h115v-182q-59 -29 -115 -39q-145 -31 -307 -31q-109 0 -195 9.5t-147 26 t-105 43t-70.5 55.5t-41.5 69.5t-20 79.5t-5 90zM406 440h364v30.5t-3 29.5t-9 32t-19.5 26t-33 24t-50.5 13.5t-71 6.5q-38 0 -67.5 -6.5t-47.5 -15.5t-31 -25t-19 -27.5t-9.5 -32t-3.5 -28.5v-27zM1006 68v182h159q-3 -104 -151 -178q-4 -4 -8 -4zM1006 68q4 0 8 4 q148 74 151 178h-159v80h165q6 53 1 102.5t-20.5 90.5t-52 76t-93.5 60v375h219v-416h4q34 50 76.5 70.5t103.5 20.5q87 0 141 -54q-82 -60 -82 -209q0 -96 38 -163t118 -86q-3 -63 -12 -110.5t-31 -96t-66.5 -75t-109.5 -26.5q-67 0 -111.5 24t-74.5 79h-2v-86h-211v162z M1006 330v329q57 -25 93.5 -60t52 -76t20.5 -90.5t-1 -102.5h-165zM1225 307q0 -158 17.5 -220t72.5 -62q57 0 75.5 62t18.5 220v9q0 49 -0.5 72.5t-3 60t-8.5 54t-16 36.5t-26.5 26.5t-39.5 7.5q-17 0 -30 -4.5t-22 -16t-16 -22t-11 -32.5t-6.5 -37.5t-3.5 -47t-1 -50 v-56.5zM1468 446q0 149 82 209q22 -23 37.5 -60t22.5 -64t10.5 -81.5t3.5 -71.5v-75v-106q-80 19 -118 86t-38 163zM1485 772q0 142 82 193q69 53 207 53q7 0 100 -6l219 -447v-209q0 -28 3.5 -79.5t4.5 -69.5h-205l-10 106h-4q-66 -118 -205 -118q-37 0 -53 2v106v75 t-3.5 71.5t-10.5 81.5t-22.5 64t-37.5 60q89 68 326 60v63q0 59 -17.5 88t-72.5 29q-28 0 -45.5 -9.5t-25 -29.5t-9.5 -37.5t-2 -46.5h-219zM1683 457q0 -127 84 -127q23 0 41.5 8t30 20t19.5 32.5t12 37.5t5.5 43.5t1.5 42.5t-0.5 42.5t-0.5 35.5q-9 -1 -31.5 -1.5 t-31 -1.5t-27 -2.5t-26 -4.5t-21.5 -8t-20 -11.5t-14.5 -16.5t-12 -22.5t-6.5 -29t-3 -37.5zM1821 1118h315l205 -475l223 475h293l-387 -735v-389h-289v389l-88 182v187q0 42 -4 73.5t-17.5 64.5t-37 55.5t-64 40.5t-96.5 26zM1874 1012q56 -8 96.5 -26t64 -40.5t37 -55.5 t17.5 -64.5t4 -73.5v-187z" />
489-<glyph unicode="&#xe045;" horiz-adv-x="1673" d="M573 580v391h316v196q0 212 138.5 362t334.5 150h313v-391h-313q-31 0 -55.5 -34t-24.5 -83v-200h393v-391h-393v-949h-393v949h-316z" />
490-<glyph unicode="&#xe046;" horiz-adv-x="1923" d="M0 -55q0 -129 127 -221.5t307 -92.5q181 0 308.5 92.5t127.5 221.5q0 131 -127.5 223t-308.5 92q-2 0 -6 -1t-6 -1q-96 92 0 207q145 8 245.5 112t100.5 248q0 57 -14 103q57 10 90 28v236q-107 -71 -238 -66q-94 64 -207 64q-154 0 -262 -107t-108 -258q0 -97 48.5 -179 t131.5 -130q-20 -25 -33 -53.5t-20.5 -67.5t4.5 -87t45 -97q-94 -42 -149.5 -112.5t-55.5 -153.5zM248 829q0 67 43.5 115.5t103.5 48.5q61 0 104.5 -48t43.5 -116t-43.5 -115.5t-104.5 -47.5q-60 0 -103.5 48t-43.5 115zM254 -55q0 55 52.5 93t127.5 38t128.5 -38t53.5 -93 q0 -54 -53.5 -92.5t-128.5 -38.5t-127.5 38.5t-52.5 92.5zM932 1513q0 69 48.5 117.5t117.5 48.5t118.5 -48.5t49.5 -117.5t-49.5 -118t-118.5 -49t-117.5 49t-48.5 118zM971 188v981h274v-981h-274zM1341 961h113v-582v-2q8 -61 39.5 -105.5t71 -65t77.5 -32t64 -12.5 l25 -2q42 -1 77 5.5t54.5 16.5t33 20t18.5 18l5 7l4 203q-60 -22 -104.5 -26.5t-64.5 5t-31.5 22t-12.5 23.5l-2 11q0 6 -2 8v488h186v208h-186v191h-252v-191h-113v-208z" />
491-<glyph unicode="&#xe047;" horiz-adv-x="1560" d="M-82 1354v37q13 25 36.5 44.5t43 30.5t62.5 22.5t61.5 15.5t73.5 14q48 9 73 13.5t68 10t67.5 5t57 -5.5t52.5 -17t38.5 -33t28.5 -51q22 -65 0 -103q-13 -22 -50.5 -33t-73.5 -20.5t-46 -26.5q-9 -14 -9 -131q0 -51 -8.5 -218t0.5 -220q8 -98 25 -108q19 -4 29.5 -3 t33.5 7.5t29 7.5q24 5 87.5 19t88 19t73.5 14.5t92.5 15.5t94.5 12q4 0 57 3t84 7.5t41 13.5q12 10 16.5 32t3 39t-6 46.5t-4.5 34.5q-18 157 0 332q0 4 2 16.5t3 19t2.5 19.5t1.5 21t0.5 19.5t0 19.5t-2 17t-4.5 15t-7 10q-8 8 -47 15t-44 10q-57 24 -93 71.5t-19 110.5 q9 26 71 58q42 21 89 34t123 25.5t102 17.5l71 -1q70 0 70 1q23 1 51.5 -35.5t45 -85t6.5 -77.5q-7 -22 -69.5 -48.5t-72.5 -37.5q-14 -18 -20 -59t-6.5 -75.5t1 -98t1.5 -83.5v-846q0 -10 -0.5 -32.5t-0.5 -39.5t0.5 -36.5t2.5 -32t6 -16.5q9 -8 46 -9t46 -4 q41 -13 69 -72.5t1 -105.5q-4 -7 -20 -14.5t-39.5 -16t-35.5 -14.5q-70 -33 -164.5 -56t-175.5 -17q-52 3 -109 62.5t-50 111.5q5 37 65 61q8 3 47.5 8t51.5 17t13.5 43.5t-4 84t-5.5 66.5v107q0 8 0.5 22t0.5 25v22.5t-1.5 19.5t-3.5 11q-16 23 -203 0q-238 -35 -363 -74 q-5 -1 -35 -9.5t-47.5 -14t-39.5 -17.5t-31 -26t-11.5 -47.5t-0.5 -63.5t6.5 -73.5t5.5 -55.5q1 -10 -0.5 -33.5t-1 -42t5.5 -26.5q8 -12 29.5 -16t45 -4t27.5 -1q35 -12 66.5 -53.5t25.5 -83.5q-4 -37 -47 -66.5t-108.5 -47t-123 -26.5t-114.5 -14t-98 5q-43 11 -83.5 58 t-37.5 87q7 51 113 86q5 2 24.5 6.5t24.5 9.5q16 20 0 158q-21 177 -25 492q-1 81 -6.5 241.5t-5.5 265.5q0 12 0.5 35.5t0.5 40.5t-0.5 36t-2.5 32t-6 18q-8 12 -46.5 18.5t-47.5 10.5q-39 17 -61.5 43.5t-43.5 77.5z" />
492-<glyph unicode="&#xe048;" d="M0 655q0 208 81 397.5t218.5 327t327 218.5t397.5 81t397.5 -81t327 -218.5t218.5 -327t81 -397.5t-81 -397.5t-218.5 -327t-327 -218.5t-397.5 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM205 655q0 -167 65 -318.5t174.5 -261t261 -174.5t318.5 -65t318.5 65 t261 174.5t174.5 261t65 318.5t-65 319t-174.5 261.5t-261 174.5t-318.5 65t-318.5 -65t-261 -174.5t-174.5 -261.5t-65 -319zM580 295q0 -63 44 -107.5t107 -44.5q67 0 116.5 49.5t49.5 116.5v17v534l410 76v-426q-30 10 -58 10q-67 0 -116.5 -49t-49.5 -117 q0 -63 43.5 -107t106.5 -44q64 0 114.5 46.5t51.5 110.5v9v16v782l-594 -102v-614q-30 10 -57 10q-69 0 -118.5 -49t-49.5 -117z" />
493-<glyph unicode="&#xe049;" horiz-adv-x="1564" d="M0 -375v2048h1565v-1673l-1170 6v-381h-395zM391 360h817v922h-817v-922z" />
494-<glyph unicode="&#xe04a;" d="M0 535v91v7.5v6.5v8v7q0 239 11 332q27 222 150 364q48 55 111 103q307 231 752 225h10v-1591h254v426q8 -12 77 -124.5t108 -168.5q59 -83 129.5 -109t187.5 -26h74v242q-37 0 -50.5 0.5t-38 3t-35 8t-28 16.5t-31.5 28t-32 42q-21 28 -42.5 62.5t-46.5 77t-40 65.5 l350 487h-303l-279 -387v928q279 -45 488 -205q40 -31 73.5 -63t59.5 -68t46 -67.5t34.5 -74.5t25 -73.5t16.5 -80.5t10 -79.5t5.5 -86.5t1.5 -86v-91v-29q0 -239 -11 -332q-27 -221 -150 -363q-47 -55 -111 -103q-300 -226 -752 -226t-752 226q-40 31 -73.5 62.5t-59.5 68 t-46 68t-34.5 74.5t-25 73.5t-16.5 80.5t-10 79.5t-5.5 86t-1.5 85.5zM166 213q76 -78 172 -107.5t221 -29.5q77 0 147 20t127 58.5t91 102t34 144.5q0 91 -27.5 154t-71 93t-96.5 47t-106.5 23t-97 13t-71 26t-27.5 54q0 53 42.5 74.5t100.5 21.5q117 0 178 -61l160 160 q-122 122 -348 122q-103 0 -187.5 -35t-138 -110.5t-53.5 -179.5q0 -77 22.5 -133t59.5 -86.5t82 -49t93.5 -26.5t90.5 -13t76.5 -13t48.5 -23q21 -24 21 -62q0 -94 -148 -94q-157 0 -231 74z" />
495-<glyph unicode="&#xe04b;" horiz-adv-x="2727" d="M-2 655q0 221 108.5 407.5t295 295t407.5 108.5q254 0 450 -130t300 -369q30 -75 264 -615q26 -58 45 -94.5t48 -75.5t61 -61t79 -37.5t107 -17.5q149 -4 243.5 73.5t94.5 196.5q0 37 -7.5 66t-27 52t-39 38.5t-57.5 32.5t-67 27t-83 28q-101 33 -172.5 63.5t-133 70.5 t-98 85.5t-57 105.5t-20.5 135q0 186 118 298t320 112q260 0 391 -236l-172 -88q-93 127 -229 127q-95 0 -157 -58.5t-62 -147.5q0 -25 5 -46t11.5 -38t21.5 -33t27 -27t36 -23.5t40.5 -20t48.5 -18.5t51 -17.5t58 -18.5t61 -19q111 -36 184 -74t126.5 -91t77.5 -124 t24 -169q0 -135 -71.5 -244t-195.5 -169.5t-276 -59.5q-105 0 -189 25t-148.5 76t-112.5 119t-91 163l-28 67l-260 590q-68 157 -214.5 253.5t-324.5 96.5q-160 0 -296 -79t-215 -215t-79 -296t79 -296t215 -214.5t296 -78.5q168 0 307.5 86.5t214.5 230.5l105 -242 q-112 -139 -276.5 -218t-350.5 -79q-221 0 -407.5 108.5t-295 295t-108.5 407.5z" />
496-<glyph unicode="&#xe04c;" horiz-adv-x="2478" d="M14 -240v1837h379l19 -16h1689l19 16h356v-1843h-350v15h-1751v-9h-361zM375 31v-164h1751v151l-707 531l-162 -133l-176 143zM375 154l629 469l-629 516v-985zM545 1466l712 -610l711 610h-1423zM1497 612l629 -471v992z" />
497-<glyph unicode="&#xe04d;" d="M0 1016l647 661v-252l617 -567l383 94l-400 -426l801 -897l-909 803l-385 -393l61 346l-522 647z" />
498-<glyph unicode="&#xe04e;" horiz-adv-x="2217" d="M0 354q-2 129 50 239t137 182t188.5 129t207 88.5t189.5 51.5t140 26l53 7v-252q-117 -9 -214.5 -40.5t-159 -74.5t-108.5 -93t-71 -98t-38.5 -87.5t-17.5 -63.5l-4 -24q-17 -78 8 -147.5t78 -119t121 -91t139 -67.5t131 -44t98 -25l38 -8v-211q-199 20 -360 71 t-258.5 116t-170 139t-104.5 144t-50.5 127t-19.5 92zM1044 -369v1848l291 200v-1888zM1405 842q52 1 106.5 -11.5t95 -31.5t73.5 -38t50 -33l17 -13l-170 -70l641 -160v502l-219 -125q-52 55 -132.5 97.5t-158 63.5t-147.5 34.5t-113 16.5l-43 3v-235z" />
499-<glyph unicode="&#xe04f;" d="M0 -96v1503q0 114 79 193t193 79h1504q114 0 193 -79t79 -193v-1503q0 -114 -79 -193.5t-193 -79.5h-1504q-114 0 -193 79.5t-79 193.5zM78 -39q0 -104 74 -178t178 -74h1388q104 0 178 74t74 178v1389q0 104 -74 178t-178 74h-1388q-104 0 -178 -74t-74 -178v-1389z M489 27v61h101q36 0 62.5 15.5t39 38t19 45t7.5 37.5l1 16v12v59v772q0 45 -12.5 78.5t-30.5 48.5t-36.5 23t-31.5 9l-12 1h-102v66h714q68 0 125 -16.5t93 -42.5t64 -58t42.5 -63.5t23.5 -57.5t11 -43l2 -16v-127q0 -63 -18.5 -113.5t-48.5 -81.5t-66 -54t-72 -33t-66 -16 t-48 -7h-19h-293v-344q0 -40 14.5 -69.5t35 -43t41.5 -21.5t35 -9l15 -1h97v-65h-687zM936 692h223q8 0 20.5 1t44.5 12t56 29.5t44 59t19 95.5l-2 125q0 8 -1 21t-12 46.5t-29.5 60.5t-60 51t-97.5 28h-205v-529z" />
500-<glyph unicode="&#xe050;" horiz-adv-x="1820" d="M0 750q0 150 46 291t130 254.5t195.5 199t250.5 132t287 46.5q186 0 354.5 -73t291 -196.5t194.5 -294.5t72 -359q0 -244 -117 -452t-315 -333q2 -5 7 -13.5t24 -32.5t43 -45t66.5 -43.5t92.5 -35.5v-155q-82 -18 -151 -13t-120 20.5t-94.5 48.5t-74.5 71t-58 88 q-102 -27 -215 -27q-185 0 -353.5 73t-290 197t-193.5 294.5t-72 357.5zM453 629q0 -156 62 -288.5t169 -210t234 -77.5q50 0 106 17q-4 6 -11 17t-30 38t-48 48.5t-62.5 39.5t-75.5 20v162v19q141 8 257 -43.5t199 -139.5q61 78 95 181t34 217v237q0 156 -62 288.5 t-169 210t-233 77.5q-127 0 -234 -77.5t-169 -210t-62 -288.5v-237z" />
501-<glyph unicode="&#xe051;" horiz-adv-x="2459" d="M0 655q0 143 39.5 278t110.5 247t170.5 205.5t217 158t253 100t276.5 35.5q178 0 332 -51v-618q-129 71 -271 71q-82 0 -173.5 -27t-157.5 -73q-93 -67 -165.5 -168.5t-72.5 -196.5q0 -184 117.5 -288.5t304.5 -104.5q159 0 309.5 85t222.5 222q9 16 26 54t17 49 q3 137 3 293t-1.5 346.5t-1.5 294.5q40 -20 78 -44.5t92 -62.5t74 -51q127 -87 284 -137.5t308 -50.5q41 0 54.5 -15.5t13.5 -60.5q0 -55 -33.5 -112t-85 -102.5t-108 -80.5t-107.5 -53q8 -63 8 -142q0 -214 -87 -405.5t-232 -326.5t-340.5 -213.5t-407.5 -78.5 q-141 0 -276.5 35.5t-253 100t-217 158t-170.5 205.5t-110.5 247t-39.5 278z" />
502-<glyph unicode="&#xe052;" horiz-adv-x="2361" d="M0 289q0 30 7 88.5t20 64.5q13 -6 21.5 -66t8.5 -87q0 -28 -8.5 -87.5t-21.5 -64.5q-13 6 -20 63.5t-7 88.5zM131 289q0 51 10.5 150t12.5 126q0 5 4 9t8 4q8 0 12 -13q3 -29 10 -86t11 -104t4 -86q0 -49 -11.5 -144.5t-13.5 -121.5q-4 -15 -12 -15q-5 0 -8.5 4.5 t-3.5 10.5q-2 25 -12.5 120.5t-10.5 145.5zM297 289q0 50 9.5 150.5t10.5 111.5q0 7 4.5 12.5t10.5 5.5q16 0 16 -18q2 -24 9 -81t10.5 -100t3.5 -81q0 -40 -3.5 -86.5t-10.5 -106.5t-9 -86q0 -16 -16 -16q-6 0 -10.5 5t-4.5 11q-1 13 -10.5 119.5t-9.5 159.5zM485 289 q0 103 9 302.5t10 223.5q0 8 5.5 14.5t12.5 6.5q9 0 15 -6.5t6 -14.5q1 -33 10.5 -228t9.5 -298q0 -53 -9.5 -158t-10.5 -119q0 -8 -6 -14t-15 -6q-7 0 -12.5 6t-5.5 14q-2 31 -7 87t-8.5 103t-3.5 87zM678 289q0 114 6.5 327t7.5 263q2 9 9 16.5t16 7.5t15.5 -7.5 t8.5 -16.5q1 -71 9 -275.5t8 -314.5q0 -51 -8 -146t-9 -127q-2 -9 -8.5 -16.5t-15.5 -7.5t-16 7.5t-9 16.5q-1 21 -7.5 120.5t-6.5 152.5zM872 289q0 108 6 315.5t7 237.5q2 12 10 21t18 9t18.5 -9t10.5 -21q1 -61 4.5 -174.5t5.5 -205.5t2 -173q0 -39 -2 -84t-5.5 -100.5 t-4.5 -84.5v3q-1 -13 -9.5 -22t-19.5 -9t-19 8t-9 20q-1 11 -7 114t-6 155zM1067 287q0 107 2 227t5.5 266.5t4.5 225.5q2 15 11 25.5t22 10.5q12 0 22 -10.5t11 -25.5q1 -79 4.5 -225.5t5.5 -266.5t2 -227q0 -37 -2 -80.5t-5.5 -97.5t-4.5 -82q-2 -14 -11.5 -24.5 t-21.5 -10.5q-13 0 -22 10.5t-11 24.5q-1 28 -4.5 82t-5.5 97.5t-2 80.5zM1230 722q0 169 3 318q-1 20 26 36t66 24t71 12t50 4q198 0 345.5 -148t164.5 -366q59 27 112 27q120 0 204.5 -94t84.5 -226t-84.5 -225.5t-204.5 -93.5h-804q-12 0 -21.5 12.5t-9.5 26.5 q0 112 -1.5 318t-1.5 375z" />
503-<glyph unicode="&#xe053;" horiz-adv-x="1261" d="M0 840v290q124 42 207 113q83 69 137 176q55 106 72 260h293v-518h485v-321h-485v-525q0 -177 18 -229q18 -50 70 -80q68 -41 155 -41q158 0 310 101v-322q-132 -64 -238 -88q-112 -25 -229 -25q-140 0 -250 35q-114 40 -183 103q-75 63 -106 139q-29 71 -29 215v717 h-227z" />
504-<glyph unicode="&#xe054;" horiz-adv-x="1875" d="M0.5 862q-5.5 39 3.5 70q8 73 32 128t53 82t57 43.5t46 19.5l19 3q50 4 98 -19t80.5 -60t54 -78.5t25.5 -75.5q3 -23 4.5 -46t1 -66t-11.5 -80t-30 -75.5t-57 -66.5t-91 -39t-100 0t-78 38t-55.5 64t-35 78t-16 80zM130.5 64q12.5 62 36 108.5t60 87.5t67 66t56.5 45 t29 24t53.5 46t109.5 106t101 135q30 49 78 89t111 60.5t128.5 15t136 -53.5t128.5 -138q6 -9 17.5 -24t51 -62t82.5 -93t111 -109.5t139 -118.5q54 -42 81 -102.5t27 -116.5t-7.5 -106t-18.5 -81l-12 -30l-8 -16t-26.5 -36.5t-48.5 -48.5t-74 -44t-102.5 -30.5t-135.5 -0.5 t-171 38q-73 24 -161.5 26.5t-140.5 -6.5l-52 -9q-8 -2 -21 -4.5t-56 -9.5t-81.5 -10.5t-96 -6t-99.5 3.5q-46 -1 -86 14t-68.5 39t-52 53.5t-38 59.5t-24.5 54.5t-14 39.5l-4 16q-17 68 -4.5 130zM426 147q-15 -98 20 -180q7 -13 20 -30t52.5 -44.5t89.5 -37.5h260v628 l-116 2v-170h-140q-39 0 -72.5 -17.5t-53.5 -42t-34.5 -49t-19.5 -42.5zM475 1364q0 131 64.5 223t156.5 92t157 -92t65 -223t-65 -223t-157 -92t-156.5 92t-64.5 223zM549 47q-12 43 8 96q4 11 12 22.5t26.5 27t41.5 22.5h113v-256h-105q-33 0 -57 22t-32 44zM932 -31 q0 -36 31 -64t61 -38l31 -10h299v444h-129v-334h-123q-18 3 -30 12.5t-14 18.5l-3 8v297l-123 -2v-332zM1039 1236q-7 54 1 110q6 61 49 131.5t107 116t119 32.5q89 -21 152.5 -117.5t48.5 -195.5q-8 -51 -31.5 -103t-59.5 -96.5t-88.5 -69.5t-111.5 -18q-59 8 -100 38.5 t-60 74t-26 97.5zM1405 752q0 307 221 307q56 0 101.5 -20.5t72 -50.5t45 -66.5t25 -65.5t6.5 -51q0 -4 0.5 -25t0.5 -35.5t-2 -41t-5.5 -46t-11 -45.5t-18 -45t-27 -39t-38 -32.5t-51 -21t-65.5 -9.5q-51 -1 -91 8t-66 24t-45 40t-29 48t-15.5 56t-6.5 56t-1 55z" />
505-<glyph unicode="&#xe055;" horiz-adv-x="2070" d="M0 -43v1389q0 134 88 233.5t221 99.5h1428q144 0 239 -76.5t95 -218.5v-120q-190 35 -228 41q-10 1 -33.5 3t-42.5 4.5t-34 6.5q-22 6 -61 20.5t-69.5 21.5t-66.5 7q-125 0 -270 -96q-66 -6 -194.5 -14.5t-231.5 -19t-195 -28.5q-137 -26 -168 -40q-46 -21 -59 -68 q-10 -39 -10 -174v-258l-7 -37l1078 -27l163 56q-86 -154 -143 -271l-217 -96l-831 -14q-7 -6 -21.5 -8t-21.5 -9q8 -51 14 -80q8 -35 32.5 -59t60.5 -36.5t66.5 -17.5t69.5 -8q422 -26 686 -26q78 0 246.5 41t259.5 41q133 0 228 -60v-110q0 -156 -80 -237t-236 -81h-1481 q-125 0 -199.5 98t-74.5 228zM1413 1075q0 29 20.5 50.5t49.5 21.5t50 -21.5t21 -50.5q0 -28 -21 -48.5t-50 -20.5t-49.5 20.5t-20.5 48.5z" />
506-<glyph unicode="&#xe056;" d="M0 653q0 208 81 397.5t218.5 327t327 218.5t397.5 81t397.5 -81t327 -218.5t218.5 -327t81 -397.5t-81 -397.5t-218.5 -327t-327 -218.5t-397.5 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5zM80 653q0 -277 146 -505.5t386 -344.5l-450 1235q-82 -184 -82 -385z M233 1171q8 0 21 -0.5t23 -0.5t18 1q98 1 252 13q24 2 35.5 -16.5t3 -38.5t-32.5 -23l-109 -10l344 -1022l207 618l-147 404q-49 6 -98 10q-24 2 -32.5 22t3 39t35.5 17q69 -5 131 -8.5t89 -3.5l28 -1q99 1 251 13q24 2 35.5 -16.5t3.5 -38.5t-32 -23l-107 -10l340 -1016 l94 315q6 18 19 60t18 59t14 49.5t13 51.5t7 42.5t3 42.5q0 134 -80 263q-5 8 -26 43.5t-27 47.5t-18.5 39t-16.5 48t-4 43q0 67 46 117.5t114 50.5q2 0 6 -1t6 -1q-127 118 -291.5 182.5t-347.5 64.5q-244 0 -452.5 -114.5t-338.5 -311.5zM758 -254q124 -37 266 -37 q165 0 313 53q-1 2 -3 6.5t-3 6.5l-291 796zM1499 -164q214 125 341.5 342.5t127.5 474.5q0 246 -115 453q7 -51 7 -96q0 -128 -72 -338z" />
507-<glyph unicode="&#xe057;" horiz-adv-x="2052" d="M0 655q0 -178 58.5 -342t164.5 -297q-28 82 -14.5 178t59.5 199.5t106.5 202.5t128 188t123.5 156.5t93 107.5l37 39q-302 187 -480 267q-131 -141 -203.5 -320.5t-72.5 -378.5zM285 -51q34 102 93 207.5t126 192.5t140.5 169.5t140 144t120 108.5t85.5 71l32 24 q13 -10 36.5 -27.5t91.5 -75t132 -117t145.5 -147.5t145 -172.5t118 -185t76.5 -192.5q-142 -149 -334.5 -233.5t-406.5 -84.5q-216 0 -407.5 84t-333.5 234zM360 1434q136 117 306.5 181t359.5 64q188 0 358 -64t306 -181q-78 41 -166.5 41t-177 -29.5t-160 -65 t-116.5 -64.5l-44 -30h-2q-9 6 -24 16.5t-62.5 39t-95 51.5t-114 46t-126 32.5t-125 1.5t-117.5 -39zM1294 1087q304 187 482 267q131 -141 203.5 -320.5t72.5 -378.5q0 -179 -58.5 -342.5t-166.5 -296.5q28 82 15 178t-59 199.5t-106.5 202.5t-128 188t-124 156.5 t-93.5 107.5z" />
508-<glyph unicode="&#xe058;" horiz-adv-x="1533" d="M7.5 473q-2.5 -108 12.5 -168q10 -37 39.5 -52t59.5 -5l418 129q45 15 63 54.5t0 78.5t-65 53l-418 168q-28 6 -56 -15.5t-34 -62.5q-17 -72 -19.5 -180zM186 1450q-20 35 2.5 70t77.5 55q169 65 350 94q59 3 83.5 -18t27.5 -60q36 -467 51 -794q3 -49 -24 -76t-66 -19 t-65 50q-304 472 -437 698zM309 -169.5q-3 30.5 19 52.5l284 340q34 39 74 43t65.5 -29t20.5 -90v-452q-5 -28 -35 -44t-69 -5q-73 12 -173.5 52t-150.5 77q-32 25 -35 55.5zM920 629q4 32 28 59l266 367q19 20 54.5 14.5t60.5 -37.5q51 -53 108 -144t76 -151q11 -38 -4 -64 t-45 -32l-428 -109q-35 -9 -63.5 3.5t-42.5 37t-10 56.5zM939.5 264q1.5 -32 23.5 -61l233 -389q16 -22 55 -19.5t68 31.5q56 49 114 128t85 142q14 40 3 70t-40 39l-420 143q-36 14 -63.5 3t-43.5 -33t-14.5 -54z" />
509-<glyph unicode="&#xe059;" horiz-adv-x="1478" d="M0 94v27v168q1 13 5.5 24.5t8.5 16.5l4 6q133 157 399.5 471.5t399.5 472.5q-116 -23 -210.5 -29.5t-149 0t-95.5 21.5t-56.5 27.5t-24.5 25.5q-2 0 -2 2q-3 4 -5 6q-12 29 -6 80q9 96 101 225q4 5 12 14.5t12 14.5q20 20 56 2q36 -20 40 -20q114 -46 304 -54 q262 -12 544 47q19 4 28.5 -3.5t8.5 -16.5v-10q-3 -28 -9 -86.5t-9 -87.5q-1 -6 -8 -15t-14.5 -16.5t-18 -17t-12.5 -11.5q-70 -82 -330 -385q-145 -169 -389 -448q-62 -73 -123 -144q-23 -26 -27 -37.5t-4 -48.5q139 5 309 -100q92 -60 176 -104.5t122 -58.5l38 -15 q250 -67 395 47q12 -47 8.5 -100.5t-14 -106.5t-37.5 -100.5t-61.5 -82.5t-85.5 -52.5t-109 -10.5q-80 9 -160.5 45t-179.5 93q-46 27 -147.5 104.5t-161.5 108.5q-98 50 -193.5 63.5t-240.5 13.5h-63q-18 0 -25 35z" />
510-<glyph unicode="&#xe05a;" horiz-adv-x="2525" d="M-129 1122q190 36 288.5 69.5t137.5 76.5q6 7 16 20.5t35 61.5t41 104q24 -30 36.5 -62t13.5 -57t-1 -45.5t-6 -31.5l-4 -11q-12 -27 -21 -43.5t-15.5 -27.5t-20 -22.5t-21 -17.5t-32.5 -22.5t-42 -28.5q-72 -55 -69 -128t63 -111q53 -32 103.5 12.5t107.5 159.5 q22 45 34.5 106.5t19.5 105.5t36 97.5t84 95.5q31 24 67.5 33.5t70.5 8.5t71.5 -3.5t78 2t82.5 20.5t92 56.5t100 104.5q5 7 14.5 17.5t41 38t65.5 48t85.5 37.5t103.5 16.5t117 -25t128 -77.5q-72 31 -137.5 39.5t-112.5 -3t-87 -32.5t-65.5 -48.5t-44 -52t-25.5 -41.5 l-8 -16q-24 -57 -45 -99t-38 -71t-37 -48.5t-35.5 -31t-39.5 -20t-42.5 -13t-52 -12.5t-60.5 -16q-75 -23 -97 -90q-20 -60 13 -105q41 -54 124 -29q34 10 71 33q62 40 103 82t60.5 75.5t39 66.5t54 65t89.5 60q69 34 138 51t116 18.5t112 3.5t109 9q61 10 103 18.5 t110.5 27.5t117 42t97.5 61t76 84q11 18 27.5 48t44 101t28.5 117q34 -119 23 -213.5t-54 -164t-90 -116t-84 -68.5l-37 -23q-124 -64 -218.5 -98.5t-139 -40.5t-98 -20t-105.5 -42q-210 -113 -106 -318q43 -84 125.5 -91t158.5 61l11 11t25 30t32 48.5t26 64.5t13 79 q27 -63 32.5 -124.5t-5.5 -104.5t-26 -77t-29 -51l-13 -16q-55 -59 -94.5 -89.5t-90 -46.5t-108 -10t-143.5 30q-109 30 -182.5 38t-112 -0.5t-76.5 -31.5q-57 -33 -87.5 -87.5t-4.5 -99.5q20 -34 43 -47.5t62 -6t96 41.5q79 47 134 61t140 17q79 2 156 -18t129 -60 q75 -49 151 -117q-83 49 -162.5 62.5t-135 -1.5t-98.5 -37.5t-64 -43.5l-21 -21q-70 -80 -118.5 -122.5t-93.5 -56t-80 -8t-91 27.5q-25 10 -61 26t-61 26.5t-44 14.5v226q0 120 -49.5 219.5t-138.5 161.5q-121 81 -275 81q-156 0 -274 -79q-42 58 -105 67v154q0 63 -44 107 t-107 44h-37zM131 -33v332q0 134 39 203q38 67 109 106t165 39q142 0 227 -89t85 -224v-277h-414v-137q0 -47 27 -72.5t75 -25.5q94 0 103 100h209q0 -128 -84 -215q-88 -88 -228 -88q-94 0 -165 39t-109 106q-39 69 -39 203zM342 215h205v115q0 56 -27.5 85t-75.5 29 t-75 -29t-27 -85v-115zM879 -193q22 74 22 146q0 23 -6 41q50 -8 70 -10q125 -11 174 -95q2 -2 4 -6.5t8.5 -19t9 -28.5t4.5 -35.5t-4 -39.5q-39 32 -83 48.5t-78 17t-62 -3t-44 -9.5z" />
511-<glyph unicode="&#xe05b;" horiz-adv-x="1742" d="M4 -115q6 63 25 135q23 93 148 719t145 715q13 55 22 85.5t25 59.5t34 42t51 24t72.5 13.5t102.5 2.5h493q121 0 276 -2t238 -2q73 0 97 -72q25 -73 -12 -158q-41 -93 -129 -122q-31 -10 -66 -10h-821l-103 -477l721 -7q77 0 104 -71q26 -69 -9 -146q-38 -85 -121 -108 q-24 -6 -50 -6h-737l-98 -508h884q130 0 157 -92q21 -73 -28 -161q-44 -78 -109 -100q-19 -6 -36 -6h-1133q-62 0 -98 35t-43.5 94.5t-1.5 122.5z" />
512-<glyph unicode="&#xe05c;" horiz-adv-x="1777" d="M0 221q0 91 64.5 156t156.5 65q91 0 156 -65t65 -156q0 -94 -69 -160q133 -151 334 -151q141 0 237 84q96 87 96 217q0 81 -51 158q-48 78 -123 131q-65 44 -235 116q-154 61 -250 121q-87 57 -150 131q-62 73 -94 152q-28 79 -28 162q0 209 165 352q168 145 404 145 q159 0 317 -67q135 -59 232 -164q76 -66 76 -164q0 -92 -65.5 -156.5t-156.5 -64.5q-92 0 -156.5 64.5t-64.5 156.5q0 39 21 90q-65 33 -181 33q-141 0 -229 -64t-88 -163q0 -87 78 -156q81 -68 262 -145q183 -79 289 -150q103 -68 168 -151q68 -83 98 -175q1 -2 2 -6t2 -6 q-72 -60 -113 -143.5t-41 -179.5q0 -109 58 -213q-25 -31 -49 -56q-177 -168 -422 -168q-243 0 -426 131q-181 130 -285 398l6 2q-10 30 -10 59zM1255 68q0 -106 74 -181t180 -75t180 75t74 181q0 105 -74.5 179.5t-179.5 74.5t-179.5 -74.5t-74.5 -179.5z" />
513-<glyph unicode="&#xe05d;" horiz-adv-x="1359" d="M0 1649h205l16 -248h21l10 6q79 133 208 202.5t296 69.5q176 0 313.5 -91.5t214 -255.5t76.5 -374q0 -154 -36.5 -282t-98.5 -216t-145.5 -149t-176.5 -89.5t-192 -28.5q-142 0 -258 58.5t-177 162.5l-4 6h-22l-6 -14v-775h-232v1559q0 181 -12 459zM244 803 q0 -63 12 -113q38 -143 151 -231t259 -88q207 0 331.5 157t124.5 418q0 244 -124.5 397.5t-321.5 153.5q-147 0 -262 -93t-152 -241q-18 -67 -18 -108v-252z" />
514-<glyph unicode="&#xe05e;" horiz-adv-x="1773" d="M0 -401v1015v1016l1026 -1016zM0 -401l1026 1015l274 -272l-413 -240l-887 -512v9zM0 1630v8l887 -512l413 -239l-274 -273zM1026 614l274 273l474 -273l-474 -272z" />
515-<glyph unicode="&#xe05f;" horiz-adv-x="2650" d="M27 643v105q0 51 81.5 94.5t222 68.5t306.5 25t306.5 -25t222 -68.5t81.5 -94.5v-105q-2 -77 -180.5 -131.5t-429.5 -54.5t-429.5 54.5t-180.5 131.5zM614 1141v55q3 38 131 66t306 28q177 0 304 -28t130 -66h2v-55h-2q-3 -40 -129.5 -68.5t-304.5 -28.5t-305 28.5 t-132 68.5zM1047 129v121v10q5 75 112.5 137.5t288 98.5t393.5 36t393.5 -36t287.5 -98.5t112 -137.5v-8v-115v-8q-4 -75 -111 -137.5t-288 -98.5t-394 -36t-393.5 36t-288 98.5t-112.5 137.5zM1513 827v2v78v6q5 59 155 100.5t360 41.5t359.5 -41.5t154.5 -100.5v-4v-80v-2 q0 -60 -150 -102.5t-364 -42.5t-364.5 42.5t-150.5 102.5z" />
516-<glyph unicode="&#xe06a;" horiz-adv-x="2312" d="M0 1319q0 40 27 67t67 27h481q33 0 59.5 -20t33.5 -52l49 -200h1380l14 43q9 30 34 47.5t55 17.5q18 0 26 -4q30 -7 49 -32.5t19 -55.5q0 -11 -4 -27l-242 -804q-7 -30 -32 -49t-56 -19h-1145q-32 0 -58 20.5t-34 51.5l-221 897h-408q-40 0 -67 27t-27 65zM762 954 l127 -508h1001l4 19l148 489h-1280zM848 -37q0 78 56 133.5t134 55.5t133.5 -55.5t55.5 -133.5t-55.5 -133t-133.5 -55t-134 55t-56 133zM981 795h340v-189h-299zM1483 606l2 189h332l-50 -189h-284zM1559 -37q0 78 56 133.5t134 55.5t133 -55.5t55 -133.5t-55 -133 t-133 -55t-134 55t-56 133z" />
517-<glyph unicode="&#xe06b;" horiz-adv-x="1918" d="M10 -184v682l238 264h174v-131h-115l-164 -182v-502h1629v502l-164 182h-115v131h174l236 -264v-682h-1893zM422 469v162v131v383l309 309h762v-692v-131v-162h-1071zM545 594h825v737h-516v-309h-309v-428z" />
518-<glyph unicode="&#xe06c;" horiz-adv-x="1425" d="M-20 176q0 129 57 201q49 64 151 92q-32 83 -32 121q0 69 71 143q75 72 142 72q31 0 82 -19q-103 297 -142 426q-49 165 -49 236q0 99 49 154q51 57 137 57q149 0 355 -604l35 -101q11 28 24 68q101 295 192.5 446.5t176.5 151.5q82 0 129 -55q49 -55 49 -144 q0 -59 -49 -231q-45 -153 -135 -410q115 -27 168 -110q55 -86 55 -273q0 -363 -217 -596q-221 -231 -561 -231q-135 0 -260 49q-123 44 -220 135q-102 95 -155 203q-53 109 -53 219zM113 186q0 -50 28 -120q26 -66 80 -138q82 -108 199 -166q117 -57 264 -57q263 0 444 199 q179 197 179 497q0 89 -13 146q-10 44 -39 69q-55 45 -217 82q-161 37 -344 37q-45 0 -57 -12q-14 -7 -14 -41q0 -83 94 -119q101 -43 338 -43h57q33 0 47 -22q17 -17 23 -64q-34 -34 -113 -63q-64 -24 -108 -54q-83 -61 -132 -141q-47 -78 -47 -151q0 -41 21 -105 q22 -68 22 -88v-12l-8 -31q-49 3 -79.5 23.5t-51.5 60.5q-36 65 -39 168q-6 -2 -24 -2h-23q2 -10 2 -25q0 -60 -47 -104q-46 -43 -111 -43q-96 0 -194 92q-98 95 -98 184q0 18 6 33q3 16 32 45q51 -62 70 -88q86 -121 156 -121q19 0 35 13q12 12 12 20q0 13 -25 59 q-17 30 -76 109q-60 77 -92 102q-32 29 -45 29q-38 0 -75 -45q-37 -46 -37 -113zM297 578q0 -28 33 -93q31 -59 92 -139q64 -82 115 -127q49 -41 73 -41q14 0 29 15q14 17 14 32q0 26 -37 119q-48 113 -94 188q-49 76 -80 101q-34 31 -63 31q-22 0 -51 -31q-31 -31 -31 -55z M389 1462q0 -71 49 -219q45 -144 135 -389q19 12 58 12q2 0 14 -1t21 -1q7 0 53 -4l-141 410q-56 158 -91 213q-26 43 -53 43q-17 0 -31 -17t-14 -47zM729 418q26 -64 39 -103q41 48 82 78q-10 2 -31 5t-31 5q-35 7 -59 15zM944 836l137 -25q102 284 142 408q51 165 51 196 q0 33 -14 51q-9 15 -31 15q-29 0 -64 -56q-36 -55 -88 -206z" />
519-<glyph unicode="&#xe06d;" d="M0 -205v1639q0 85 60 144.5t145 59.5h1638q85 0 145 -59.5t60 -144.5v-1639q0 -85 -60 -145t-145 -60h-1638q-85 0 -145 60t-60 145zM410 614q0 -167 82 -308.5t223.5 -223.5t308.5 -82t308.5 82t223.5 223.5t82 308.5q0 125 -48.5 239t-130.5 196.5t-196 131t-239 48.5 t-239 -48.5t-196 -131t-130.5 -196.5t-48.5 -239zM614 614q0 169 120.5 289.5t289.5 120.5t289.5 -120.5t120.5 -289.5t-120.5 -289t-289.5 -120t-289.5 120t-120.5 289z" />
520-<glyph unicode="&#xe06e;" horiz-adv-x="1425" />
521-<glyph horiz-adv-x="1359" />
522-</font>
523-</defs></svg>
524\ No newline at end of file
525
526=== removed file 'auth_oauth/static/lib/zocial/css/zocial-regular-webfont.ttf'
527Binary files auth_oauth/static/lib/zocial/css/zocial-regular-webfont.ttf 2013-10-27 12:31:04 +0000 and auth_oauth/static/lib/zocial/css/zocial-regular-webfont.ttf 1970-01-01 00:00:00 +0000 differ
528=== removed file 'auth_oauth/static/lib/zocial/css/zocial-regular-webfont.woff'
529Binary files auth_oauth/static/lib/zocial/css/zocial-regular-webfont.woff 2013-10-27 12:31:04 +0000 and auth_oauth/static/lib/zocial/css/zocial-regular-webfont.woff 1970-01-01 00:00:00 +0000 differ
530=== removed file 'auth_oauth/static/lib/zocial/css/zocial.css'
531--- auth_oauth/static/lib/zocial/css/zocial.css 2012-08-15 22:47:08 +0000
532+++ auth_oauth/static/lib/zocial/css/zocial.css 1970-01-01 00:00:00 +0000
533@@ -1,420 +0,0 @@
534-@charset "UTF-8";
535-
536-/*!
537-Code written by Sam Collins (@smcllns) of www.eventasaur.us
538-You are free to use this work commercially
539-You are free to extend this work without permissions from the author (just do so tastefully eh?)
540-Enjoy
541-*/
542-
543-/* Reference icons from font-files */
544-
545-@font-face {
546- font-family: 'zocial';
547- font-style: normal;
548- font-weight: normal;
549- src: url('zocial-regular-webfont.eot');
550- src: url('zocial-regular-webfont.eot?#iefix') format('embedded-opentype'),
551- url('zocial-regular-webfont.woff') format('woff'),
552- url('zocial-regular-webfont.ttf') format('truetype'),
553- url('zocial-regular-webfont.svg#ZocialRegular') format('svg');
554- unicode-range: U+0-U+10FFFF;
555-}
556-
557-/* Button structure */
558-
559-.zocial,
560-a.zocial {
561- border: 1px solid #777;
562- border-color: rgba(0,0,0,0.2);
563- border-bottom-color: #333;
564- border-bottom-color: rgba(0,0,0,0.4);
565- color: #fff;
566- -moz-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.4), inset 0 0 0.1em rgba(255,255,255,0.9);
567- -webkit-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.4), inset 0 0 0.1em rgba(255,255,255,0.9);
568- box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.4), inset 0 0 0.1em rgba(255,255,255,0.9);
569- cursor: pointer;
570- display: inline-block;
571- font: bold 100%/2.1 "Lucida Grande", Tahoma, sans-serif;
572- padding: 0 .95em 0 0;
573- text-align: center;
574- text-decoration: none;
575- text-shadow: 0 1px 0 rgba(0,0,0,0.5);
576- white-space: nowrap;
577-
578- -moz-user-select: none;
579- -webkit-user-select: none;
580- user-select: none;
581-
582- position: relative;
583-
584- -moz-border-radius: .3em;
585- -webkit-border-radius: .3em;
586- border-radius: .3em;
587-}
588-
589-.zocial:before {
590- content: "";
591- border-right: 0.075em solid rgba(0,0,0,0.1);
592- float: left;
593- font: 120%/1.65 zocial;
594- font-style: normal;
595- font-weight: normal;
596- margin: 0 0.5em 0 0;
597- padding: 0 0.5em;
598- text-align: center;
599- text-decoration: none;
600- text-transform: none;
601-
602- -moz-box-shadow: 0.075em 0 0 rgba(255,255,255,0.25);
603- -webkit-box-shadow: 0.075em 0 0 rgba(255,255,255,0.25);
604- box-shadow: 0.075em 0 0 rgba(255,255,255,0.25);
605-
606- -webkit-font-smoothing: antialiased;
607-}
608-
609-.zocial:active {
610- outline: none; /* outline is visible on :focus */
611-}
612-
613-/* Buttons can be displayed as standalone icons by adding a class of "icon" */
614-
615-.zocial.icon {
616- overflow: hidden;
617- max-width: 2.4em;
618- padding-left: 0;
619- padding-right: 0;
620- max-height: 2.15em;
621- white-space: nowrap;
622-}
623-.zocial.icon:before {
624- padding: 0;
625- width: 2em;
626- height: 2em;
627-
628- box-shadow: none;
629- border: none;
630-}
631-
632-/* Gradients */
633-
634-.zocial {
635- background-image: -moz-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1));
636- background-image: -ms-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1));
637- background-image: -o-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1));
638- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,.1)), color-stop(49%, rgba(255,255,255,.05)), color-stop(51%, rgba(0,0,0,.05)), to(rgba(0,0,0,.1)));
639- background-image: -webkit-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1));
640- background-image: linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1));
641-}
642-
643-.zocial:hover, .zocial:focus {
644- background-image: -moz-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15));
645- background-image: -ms-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15));
646- background-image: -o-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15));
647- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,.15)), color-stop(49%, rgba(255,255,255,.15)), color-stop(51%, rgba(0,0,0,.1)), to(rgba(0,0,0,.15)));
648- background-image: -webkit-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15));
649- background-image: linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15));
650-}
651-
652-.zocial:active {
653- background-image: -moz-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1));
654- background-image: -ms-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1));
655- background-image: -o-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1));
656- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,.1)), color-stop(30%, rgba(255,255,255,0)), color-stop(50%, transparent), to(rgba(0,0,0,.1)));
657- background-image: -webkit-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1));
658- background-image: linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1));
659-}
660-
661-/* Adjustments for light background buttons */
662-
663-.zocial.bitcoin,
664-.zocial.cloudapp,
665-.zocial.dropbox,
666-.zocial.email,
667-.zocial.eventful,
668-.zocial.github,
669-.zocial.gmail,
670-.zocial.instapaper,
671-.zocial.itunes,
672-.zocial.ninetyninedesigns,
673-.zocial.openid,
674-.zocial.plancast,
675-.zocial.posterous,
676-.zocial.reddit,
677-.zocial.secondary,
678-.zocial.viadeo,
679-.zocial.weibo,
680-.zocial.wikipedia {
681- border: 1px solid #aaa;
682- border-color: rgba(0,0,0,0.3);
683- border-bottom-color: #777;
684- border-bottom-color: rgba(0,0,0,0.5);
685- -moz-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.7), inset 0 0 0.08em rgba(255,255,255,0.5);
686- -webkit-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.7), inset 0 0 0.08em rgba(255,255,255,0.5);
687- box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.7), inset 0 0 0.08em rgba(255,255,255,0.5);
688- text-shadow: 0 1px 0 rgba(255,255,255,0.8);
689-}
690-
691-/* :hover adjustments for light background buttons */
692-
693-.zocial.bitcoin:focus,
694-.zocial.bitcoin:hover,
695-.zocial.dropbox:focus,
696-.zocial.dropbox:hover,
697-.zocial.email:focus,
698-.zocial.email:hover,
699-.zocial.eventful:focus,
700-.zocial.eventful:hover,
701-.zocial.github:focus,
702-.zocial.github:hover,
703-.zocial.gmail:focus,
704-.zocial.gmail:hover,
705-.zocial.instapaper:focus,
706-.zocial.instapaper:hover,
707-.zocial.itunes:focus,
708-.zocial.itunes:hover,
709-.zocial.ninetyninedesigns:focus,
710-.zocial.ninetyninedesigns:hover,
711-.zocial.openid:focus,
712-.zocial.openid:hover,
713-.zocial.plancast:focus,
714-.zocial.plancast:hover,
715-.zocial.posterous:focus,
716-.zocial.posterous:hover,
717-.zocial.reddit:focus,
718-.zocial.reddit:hover,
719-.zocial.secondary:focus,
720-.zocial.secondary:hover,
721-.zocial.twitter:focus,
722-.zocial.viadeo:focus,
723-.zocial.viadeo:hover,
724-.zocial.weibo:focus,
725-.zocial.weibo:hover,
726-.zocial.wikipedia:focus,
727-.zocial.wikipedia:hover {
728- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0.5)), color-stop(49%, rgba(255,255,255,0.2)), color-stop(51%, rgba(0,0,0,0.05)), to(rgba(0,0,0,0.15)));
729- background-image: -moz-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15));
730- background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15));
731- background-image: -o-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15));
732- background-image: -ms-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15));
733- background-image: linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15));
734-}
735-
736-/* :active adjustments for light background buttons */
737-
738-.zocial.bitcoin:active,
739-.zocial.dropbox:active,
740-.zocial.email:active,
741-.zocial.eventful:active,
742-.zocial.github:active,
743-.zocial.gmail:active,
744-.zocial.instapaper:active,
745-.zocial.itunes:active,
746-.zocial.ninetyninedesigns:active,
747-.zocial.openid:active,
748-.zocial.plancast:active,
749-.zocial.posterous:active,
750-.zocial.reddit:active,
751-.zocial.secondary:active,
752-.zocial.viadeo:active,
753-.zocial.weibo:active,
754-.zocial.wikipedia:active {
755- background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0)), color-stop(30%, rgba(255,255,255,0)), color-stop(50%, rgba(0,0,0,0)), to(rgba(0,0,0,0.1)));
756- background-image: -moz-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1));
757- background-image: -webkit-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1));
758- background-image: -o-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1));
759- background-image: -ms-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1));
760- background-image: linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1));
761-}
762-
763-/* Button icon and color */
764-/* Icon characters are stored in unicode private area */
765-.zocial.amazon:before {content: "\E040";}
766-.zocial.android:before {content: "\E005";}
767-.zocial.angellist:before {content: "\E06C";}
768-.zocial.aol:before {content: "\E001";}
769-.zocial.appstore:before {content: "\E020";}
770-.zocial.bitcoin:before {content: "\E011"; color: #f7931a;}
771-.zocial.blogger:before {content: "\E021";}
772-.zocial.call:before {content: "\E016";}
773-.zocial.cal:before {content: "\E00D";}
774-.zocial.cart:before {content: "\E06A";}
775-.zocial.chrome:before {content: "\E03A";}
776-.zocial.cloudapp:before {content: "\E042";}
777-.zocial.creativecommons:before {content: "\E022";}
778-.zocial.delicious:before {content: "\E002";}
779-.zocial.digg:before {content: "\E01A";}
780-.zocial.disqus:before {content: "\E030";}
781-.zocial.dribbble:before {content: "\E023";}
782-.zocial.dropbox:before {content: "\E043"; color: #1f75cc;}
783-.zocial.email:before {content: "\E03C"; color: #312c2a;}
784-.zocial.eventasaurus:before {content: "\E055"; color: #9de428;}
785-.zocial.eventbrite:before {content: "\E05B";}
786-.zocial.eventful:before {content: "\E006"; color: #0066CC;}
787-.zocial.evernote:before {content: "\E024";}
788-.zocial.facebook:before {content: "\E045";}
789-.zocial.fivehundredpx:before {content: "\E00F"; color: #29b6ff;}
790-.zocial.flattr:before {content: "\E004";}
791-.zocial.flickr:before {content: "\E025";}
792-.zocial.forrst:before {content: "\E019"; color: #50894f;}
793-.zocial.foursquare:before {content: "\E013";}
794-.zocial.github:before {content: "\E046";}
795-.zocial.gmail:before {content: "\E04C"; color: #f00;}
796-.zocial.google:before {content: "\E026";}
797-.zocial.googleplay:before {content: "\E05E";}
798-.zocial.googleplus:before {content: "\E00A";}
799-.zocial.gowalla:before {content: "\E01F";}
800-.zocial.grooveshark:before {content: "\E017";}
801-.zocial.guest:before {content: "\E01E";}
802-.zocial.html5:before {content: "\E014";}
803-.zocial.ie:before {content: "\E015";}
804-.zocial.instagram:before {content: "\E06D";}
805-.zocial.instapaper:before {content: "\E028";}
806-.zocial.intensedebate:before {content: "\E05A";}
807-.zocial.itunes:before {content: "\E048"; color: #1a6dd2;}
808-.zocial.klout:before {content: "\E02A"; }
809-.zocial.lanyrd:before {content: "\E00C";}
810-.zocial.lastfm:before {content: "\E04B";}
811-.zocial.linkedin:before {content: "\E02B";}
812-.zocial.macstore:before {content: "\E03D";}
813-.zocial.meetup:before {content: "\E02C";}
814-.zocial.myspace:before {content: "\E03E";}
815-.zocial.ninetyninedesigns:before {content: "\E018"; color: #f50;}
816-.zocial.openid:before {content: "\E04E"; color: #ff921d;}
817-.zocial.opentable:before {content: "\E05F";}
818-.zocial.paypal:before {content: "\E003";}
819-.zocial.pinboard:before {content: "\E04D";}
820-.zocial.pinterest:before {content: "\E010";}
821-.zocial.plancast:before {content: "\E02F";}
822-.zocial.plurk:before {content: "\E049";}
823-.zocial.podcast:before {content: "\E03F";}
824-.zocial.posterous:before {content: "\E05D";}
825-.zocial.print:before {content: "\E06B";}
826-.zocial.quora:before {content: "\E050";}
827-.zocial.reddit:before {content: "\E01D"; color: red;}
828-.zocial.rss:before {content: "\E031";}
829-.zocial.scribd:before {content: "\E05C"; color: #00d5ea;}
830-.zocial.skype:before {content: "\E032";}
831-.zocial.smashing:before {content: "\E009";}
832-.zocial.songkick:before {content: "\E04A";}
833-.zocial.soundcloud:before {content: "\E052";}
834-.zocial.spotify:before {content: "\E01C";}
835-.zocial.stumbleupon:before {content: "\E00E";}
836-.zocial.tumblr:before {content: "\E053";}
837-.zocial.twitter:before {content: "\E033";}
838-.zocial.viadeo:before {content: "\E027"; color: #f59b20;}
839-.zocial.vimeo:before {content: "\E035";}
840-.zocial.weibo:before {content: "\E029"; color: #e6162d;}
841-.zocial.wikipedia:before {content: "\E00B";}
842-.zocial.windows:before {content: "\E036";}
843-.zocial.xing:before {content: "\E037"}
844-.zocial.wordpress:before {content: "\E056";}
845-.zocial.yahoo:before {content: "\E038";}
846-.zocial.yelp:before {content: "\E058";}
847-.zocial.youtube:before {content: "\E034";}
848-
849-/* Button background and text color */
850-
851-.zocial.amazon {background-color: #ffad1d; color: #030037; text-shadow: 0 1px 0 rgba(255,255,255,0.5);}
852-.zocial.android {background-color: #a4c639;}
853-.zocial.angellist {background-color: #000;}
854-.zocial.aol {background-color: #f00;}
855-.zocial.appstore {background-color: #000;}
856-.zocial.bitcoin {background-color: #efefef; color: #4d4d4d;}
857-.zocial.blogger {background-color: #ee5a22;}
858-.zocial.call {background-color: #008000;}
859-.zocial.cal {background-color: #d63538;}
860-.zocial.cart {background-color: #333;}
861-.zocial.chrome {background-color: #006cd4;}
862-.zocial.cloudapp {background-color: #fff; color: #312c2a;}
863-.zocial.creativecommons {background-color: #000;}
864-.zocial.delicious {background-color: #3271cb;}
865-.zocial.digg {background-color: #164673;}
866-.zocial.disqus {background-color: #5d8aad;}
867-.zocial.dribbble {background-color: #ea4c89;}
868-.zocial.dropbox {background-color: #fff; color: #312c2a;}
869-.zocial.email {background-color: #f0f0eb; color: #312c2a;}
870-.zocial.eventasaurus {background-color: #192931; color: #fff;}
871-.zocial.eventbrite {background-color: #ff5616;}
872-.zocial.eventful {background-color: #fff; color: #47ab15;}
873-.zocial.evernote {background-color: #6bb130; color: #fff;}
874-.zocial.facebook {background-color: #4863ae;}
875-.zocial.fivehundredpx {background-color: #333;}
876-.zocial.flattr {background-color: #8aba42;}
877-.zocial.flickr {background-color: #ff0084;}
878-.zocial.forrst {background-color: #1e360d;}
879-.zocial.foursquare {background-color: #44a8e0;}
880-.zocial.github {background-color: #fbfbfb; color: #050505;}
881-.zocial.gmail {background-color: #efefef; color: #222;}
882-.zocial.google {background-color: #4e6cf7;}
883-.zocial.googleplay {background-color: #000;}
884-.zocial.googleplus {background-color: #dd4b39;}
885-.zocial.gowalla {background-color: #ff720a;}
886-.zocial.grooveshark {background-color: #111; color:#eee;}
887-.zocial.guest {background-color: #1b4d6d;}
888-.zocial.html5 {background-color: #ff3617;}
889-.zocial.ie {background-color: #00a1d9;}
890-.zocial.instapaper {background-color: #eee; color: #222;}
891-.zocial.instagram {background-color: #3f729b;}
892-.zocial.intensedebate {background-color: #0099e1;}
893-.zocial.klout {background-color: #e34a25;}
894-.zocial.itunes {background-color: #efefeb; color: #312c2a;}
895-.zocial.lanyrd {background-color: #2e6ac2;}
896-.zocial.lastfm {background-color: #dc1a23;}
897-.zocial.linkedin {background-color: #0083a8;}
898-.zocial.macstore {background-color: #007dcb}
899-.zocial.meetup {background-color: #ff0026;}
900-.zocial.myspace {background-color: #000;}
901-.zocial.ninetyninedesigns {background-color: #fff; color: #072243;}
902-.zocial.openid {background-color: #f5f5f5; color: #333;}
903-.zocial.opentable {background-color: #990000;}
904-.zocial.paypal {background-color: #fff; color: #32689a; text-shadow: 0 1px 0 rgba(255,255,255,0.5);}
905-.zocial.pinboard {background-color: blue;}
906-.zocial.pinterest {background-color: #c91618;}
907-.zocial.plancast {background-color: #e7ebed; color: #333;}
908-.zocial.plurk {background-color: #cf682f;}
909-.zocial.podcast {background-color: #9365ce;}
910-.zocial.posterous {background-color: #ffd959; color: #bc7134;}
911-.zocial.print {background-color: #f0f0eb; color: #222; text-shadow: 0 1px 0 rgba(255,255,255,0.8);}
912-.zocial.quora {background-color: #a82400;}
913-.zocial.reddit {background-color: #fff; color: #222;}
914-.zocial.rss {background-color: #ff7f25;}
915-.zocial.scribd {background-color: #231c1a;}
916-.zocial.skype {background-color: #00a2ed;}
917-.zocial.smashing {background-color: #ff4f27;}
918-.zocial.songkick {background-color: #ff0050;}
919-.zocial.soundcloud {background-color: #ff4500;}
920-.zocial.spotify {background-color: #60af00;}
921-.zocial.stumbleupon {background-color: #eb4924;}
922-.zocial.tumblr {background-color: #374a61;}
923-.zocial.twitter {background-color: #46c0fb;}
924-.zocial.viadeo {background-color: #fff; color: #000;}
925-.zocial.vimeo {background-color: #00a2cd;}
926-.zocial.weibo {background-color: #faf6f1; color: #000;}
927-.zocial.wikipedia {background-color: #fff; color: #000;}
928-.zocial.windows {background-color: #0052a4; color: #fff;}
929-.zocial.wordpress {background-color: #464646;}
930-.zocial.xing {background-color: #0A5D5E;}
931-.zocial.yahoo {background-color: #a200c2;}
932-.zocial.yelp {background-color: #e60010;}
933-.zocial.youtube {background-color: #f00;}
934-
935-/*
936-The Miscellaneous Buttons
937-These button have no icons and can be general purpose buttons while ensuring consistent button style
938-Credit to @guillermovs for suggesting
939-*/
940-
941-.zocial.primary, .zocial.secondary {margin: 0.1em 0; padding: 0 1em;}
942-.zocial.primary:before, .zocial.secondary:before {display: none;}
943-.zocial.primary {background-color: #333;}
944-.zocial.secondary {background-color: #f0f0eb; color: #222; text-shadow: 0 1px 0 rgba(255,255,255,0.8);}
945-
946-/* Any browser-specific adjustments */
947-
948-button:-moz-focus-inner {
949- border: 0;
950- padding: 0;
951-}
952-
953-
954
955=== removed file 'auth_oauth/static/lib/zocial/sample.html'
956--- auth_oauth/static/lib/zocial/sample.html 2012-08-15 22:47:08 +0000
957+++ auth_oauth/static/lib/zocial/sample.html 1970-01-01 00:00:00 +0000
958@@ -1,265 +0,0 @@
959-<!DOCTYPE html>
960-<html>
961-<head>
962- <meta charset="utf-8">
963- <title>Zocial CSS3 Buttons</title>
964- <link rel="stylesheet" type="text/css" href="css/zocial.css" />
965- <link href='http://fonts.googleapis.com/css?family=Pompiere' rel='stylesheet' type='text/css'>
966-
967- <style>
968- html {
969- background: #f0f0eb;
970- font-family: "Helvetica Neue", sans-serif;
971- }
972- h2, p {
973- font-family: "Pompiere","Helvetica Neue", sans-serif;
974- }
975- body {
976- background: #FFF;
977- -webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.5);
978- -moz-box-shadow: 0 1px 1px rgba(0,0,0,0.5);
979- box-shadow: 0 1px 1px rgba(0,0,0,0.5);
980- -webkit-border-radius: 0 0 2px 2px;
981- -moz-border-radius: 0 0 2px 2px;
982- border-radius: 0 0 2px 2px;
983- margin: 0 auto 2em;
984- padding: 2em 1em;
985- width: 600px;
986- }
987- body .zocial {
988- margin: 8px 4px;
989- font-size: 13px;
990- }
991- h2 {
992- font-size: 17px;
993- font-weight: normal;
994- padding: 1em 0 0.75em;
995- border-bottom: 1px solid #eee;
996- }
997- </style>
998-
999- <!--[if IE]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
1000-
1001-</head>
1002-
1003-<body>
1004- <h2 id="popular-kids">The Popular Kids</h2>
1005- <a href="#" class="zocial facebook">Sign in with Facebook</a>
1006- <a href="#" class="zocial googleplus">Sign in with Google+</a>
1007- <a href="#" class="zocial twitter">Sign in with Twitter</a>
1008- <a href="#" class="zocial linkedin">Sign in with LinkedIn</a>
1009-
1010- <h2 id="cool-kids">The Cool Kids</h2>
1011- <a href="#" class="zocial dropbox">Sync with Dropbox</a>
1012- <a href="#" class="zocial evernote">Clip to Evernote</a>
1013- <a href="#" class="zocial forrst">Follow me on Forrst</a>
1014- <a href="#" class="zocial dribbble">Sign in with Dribbble</a>
1015- <a href="#" class="zocial cloudapp">Sign in to CloudApp</a>
1016- <a href="#" class="zocial github">Fork me on Github</a>
1017- <a href="#" class="zocial spotify">Play on Spotify</a>
1018- <a href="#" class="zocial instapaper">Read It Later</a>
1019- <a href="#" class="zocial soundcloud">Follow me on Soundcloud</a>
1020- <a href="#" class="zocial tumblr">Follow me on Tumblr</a>
1021- <a href="#" class="zocial smashing">Read on Smashing Magazine</a>
1022- <a href="#" class="zocial itunes">Available on iTunes</a>
1023- <a href="#" class="zocial appstore">Available on the App Store</a>
1024- <a href="#" class="zocial macstore">Available on the Mac App Store</a>
1025- <a href="#" class="zocial android">Available on Android Market</a>
1026- <a href="#" class="zocial pinterest">Follow me on Pinterest</a>
1027- <a href="#" class="zocial quora">Follow me on Quora</a>
1028- <a href="#" class="zocial lanyrd">Attend on Lanyrd</a>
1029-
1030- <h2 id="not-so-cool-kids">The Not-So-Cool But Have-To-Be-Invited Kids</h2>
1031- <a href="#" class="zocial paypal">Pay with Paypal</a>
1032- <a href="#" class="zocial amazon">Sign in with Amazon</a>
1033- <a href="#" class="zocial skype">Call me on Skype</a>
1034- <a href="#" class="zocial lastfm">Sign in with Last.fm</a>
1035- <a href="#" class="zocial yelp">Write a review on Yelp</a>
1036- <a href="#" class="zocial foursquare">Check in with foursquare</a>
1037- <a href="#" class="zocial klout">Influence with Klout</a>
1038-
1039- <h2 id="older-kids">The Older (but Solid) Kids</h2>
1040- <a href="#" class="zocial wikipedia">View on Wikipedia</a>
1041- <a href="#" class="zocial disqus">Sign in with Disqus</a>
1042- <a href="#" class="zocial intensedebate">Sign in with IntenseDebate</a>
1043- <a href="#" class="zocial google">Sign in with Google</a>
1044- <a href="#" class="zocial gmail">Sign in with Gmail</a>
1045- <a href="#" class="zocial vimeo">Upload to Vimeo</a>
1046- <a href="#" class="zocial scribd">Read more on Scribd</a>
1047- <a href="#" class="zocial youtube">Subscribe on YouTube</a>
1048- <a href="#" class="zocial wordpress">Sign in with WordPress</a>
1049- <a href="#" class="zocial songkick">Sign in with Songkick</a>
1050- <a href="#" class="zocial posterous">Sign in with Posterous</a>
1051- <a href="#" class="zocial eventbrite">Sign in with Eventbrite</a>
1052- <a href="#" class="zocial flattr">Tip with Flattr</a>
1053- <a href="#" class="zocial plancast">Follow me on Plancast</a>
1054-
1055-
1056- <h2 id="smelly-kids">The Kids That Kinda Smell but Some People Don't Mind</h2>
1057- <a href="#" class="zocial yahoo">Submit resume for CEO</a>
1058- <a href="#" class="zocial ie">Download Internet Explorer 5</a>
1059- <a href="#" class="zocial meetup">Report bugs with Meetup.com</a>
1060- <a href="#" class="zocial openid">Learn how-to-use OpenID</a>
1061- <a href="#" class="zocial html5">Register now for HTML6</a>
1062- <a href="#" class="zocial aol">Chat with your parents</a>
1063-
1064- <h2 id="quiet-kids">The Kids That Nobody Normally Notices</h2>
1065- <a href="#" class="zocial guest">Sign in as guest</a>
1066- <a href="#" class="zocial creativecommons">View Creative Commons Licence</a>
1067- <a href="#" class="zocial rss">Subscribe to RSS</a>
1068- <a href="#" class="zocial chrome">Add to Chrome</a>
1069-
1070- <h2>The He's-My-Son-So-Of-Course-He's-Here Kid</h2>
1071- <a href="#" class="zocial eventasaurus">Sign up for Eventasaurus</a>
1072-
1073- <h2 id="kids-by-request">Kids By Request</h2>
1074- <a href="#" class="zocial weibo">Join me on Weibo</a>
1075- <a href="#" class="zocial plurk">Sign in with Plurk</a>
1076- <a href="#" class="zocial grooveshark">Play on Grooveshark</a>
1077- <a href="#" class="zocial blogger">Post on Blogger</a>
1078- <a href="#" class="zocial viadeo">Sign in with Viadeo</a>
1079- <a href="#" class="zocial podcast">Subscribe to this Podcast</a>
1080- <a href="#" class="zocial fivehundredpx">View Portfolio on 500px</a>
1081- <a href="#" class="zocial bitcoin">Bitcoin accepted here</a>
1082- <a href="#" class="zocial ninetyninedesigns">View Portfolio on 99Designs</a>
1083- <a href="#" class="zocial pinboard">Bookmark with Pinboard</a>
1084- <a href="#" class="zocial stumbleupon">Stumble!</a>
1085- <a href="#" class="zocial myspace">Find me on Myspace</a>
1086- <a href="#" class="zocial windows">Sign in with Windows Live</a>
1087- <a href="#" class="zocial eventful">Find Events with Eventful</a>
1088- <a href="#" class="zocial xing">Sign in with Xing</a>
1089- <a href="#" class="zocial flickr">Upload to Flickr</a>
1090- <a href="#" class="zocial delicious">Sign in with Del.icio.us</a>
1091- <a href="#" class="zocial googleplay">Download from Google Play</a>
1092- <a href="#" class="zocial opentable">Reserve with OpenTable</a>
1093- <a href="#" class="zocial digg">Digg this</a>
1094- <a href="#" class="zocial reddit">Share on Reddit</a>
1095- <a href="#" class="zocial angellist">Fund us on AngelList</a>
1096- <a href="#" class="zocial instagram">Sign-in with Instagram</a>
1097-
1098- <h2 id="multipurpose-kids">The Multi-Purpose Kids (Credit: <a href="http://pictos.drewwilson.com">Pictos Icons</a>)</h2>
1099-
1100- <a href="#" class="zocial call">Call a phone</a>
1101- <a href="#" class="zocial email">Send a message</a>
1102- <a href="#" class="zocial cal">Add to calendar</a>
1103- <a href="#" class="zocial cart">Add to cart</a>
1104- <a href="#" class="zocial print">Print this page</a>
1105- <a href="#" class="zocial primary" title="A primary button for general purposes to keep consistency with Zocial">Primary action</a>
1106- <a href="#" class="zocial secondary" title="A secondary button for general purposes to keep consistency with Zocial">Secondary action</a>
1107-
1108-
1109- <h2 id="icons">Icon versions of the above</h2>
1110- <a href="#" class="zocial icon facebook">Sign in with Facebook</a>
1111- <a href="#" class="zocial icon googleplus">Sign in with Google+</a>
1112- <a href="#" class="zocial icon twitter">Sign in with Twitter</a>
1113- <a href="#" class="zocial icon google">Sign in with Google</a>
1114- <a href="#" class="zocial icon linkedin">Sign in with LinkedIn</a>
1115- <a href="#" class="zocial icon paypal">Pay with Paypal</a>
1116- <a href="#" class="zocial icon amazon">Sign in with Amazon</a>
1117- <a href="#" class="zocial icon dropbox">Sync with Dropbox</a>
1118- <a href="#" class="zocial icon evernote">Clip to Evernote</a>
1119- <a href="#" class="zocial icon skype">Call me on Skype</a>
1120- <a href="#" class="zocial icon guest">Sign in as guest</a>
1121- <a href="#" class="zocial icon spotify">Play on Spotify</a>
1122- <a href="#" class="zocial icon lastfm">Sign in with Last.fm</a>
1123- <a href="#" class="zocial icon songkick">Sign in with Songkick</a>
1124- <a href="#" class="zocial icon forrst">Follow me on Forrst</a>
1125- <a href="#" class="zocial icon dribbble">Sign in with Dribbble</a>
1126- <a href="#" class="zocial icon cloudapp">Sign in to CloudApp</a>
1127- <a href="#" class="zocial icon github">Fork me on Github</a>
1128- <a href="#" class="zocial pinterest icon">Follow me on Pinterest</a>
1129- <a href="#" class="zocial quora icon">Follow me on Quora</a>
1130- <a href="#" class="zocial pinboard icon">Bookmark with Pinboard</a>
1131- <a href="#" class="zocial lanyrd icon">Attend on Lanyrd</a>
1132- <a href="#" class="zocial icon itunes">Download on iTunes</a>
1133- <a href="#" class="zocial icon android">Download on Android</a>
1134- <a href="#" class="zocial icon disqus">Sign in with Disqus</a>
1135- <a href="#" class="zocial icon yahoo">Sign in with Yahoo</a>
1136- <a href="#" class="zocial icon vimeo">Upload to Vimeo</a>
1137- <a href="#" class="zocial icon chrome">Add to Chrome</a>
1138- <a href="#" class="zocial icon ie">Get a new browser</a>
1139- <a href="#" class="zocial icon html5">Made from HTML5</a>
1140- <a href="#" class="zocial icon instapaper">Read It Later</a>
1141- <a href="#" class="zocial icon scribd">Read more on Scribd</a>
1142- <a href="#" class="zocial icon wikipedia">View on Wikipedia</a>
1143- <a href="#" class="zocial icon flattr">Tip with Flattr</a>
1144- <a href="#" class="zocial icon tumblr">Follow me on Tumblr</a>
1145- <a href="#" class="zocial icon posterous">Subscribe to my Posterous</a>
1146- <a href="#" class="zocial icon gowalla">Check in with Gowalla</a>
1147- <a href="#" class="zocial icon foursquare">Check in with foursquare</a>
1148- <a href="#" class="zocial icon yelp">Write a review on Yelp</a>
1149- <a href="#" class="zocial icon soundcloud">Follow me on Soundcloud</a>
1150- <a href="#" class="zocial icon smashing">Read on Smashing Magazine</a>
1151- <a href="#" class="zocial icon wordpress">Sign in with WordPress</a>
1152- <a href="#" class="zocial icon intensedebate">Sign in with IntenseDebate</a>
1153- <a href="#" class="zocial icon openid">Sign in with OpenID</a>
1154- <a href="#" class="zocial icon gmail">Sign in with Gmail</a>
1155- <a href="#" class="zocial icon eventbrite">Sign in with Eventbrite</a>
1156- <a href="#" class="zocial icon eventasaurus">Sign in with Eventasaurus</a>
1157- <a href="#" class="zocial icon meetup">Sign in with Meetup.com</a>
1158- <a href="#" class="zocial icon aol">Sign in with AIM</a>
1159- <a href="#" class="zocial icon plancast">Follow me on Plancast</a>
1160- <a href="#" class="zocial icon youtube">Subscribe on YouTube</a>
1161- <a href="#" class="zocial icon appstore">Available on the Mac App Store</a>
1162- <a href="#" class="zocial icon creativecommons">View Creative Commons Licence</a>
1163- <a href="#" class="zocial icon rss">Subscribe to RSS</a>
1164- <a href="#" class="zocial weibo icon">Follow me on Weibo</a>
1165- <a href="#" class="zocial plurk icon">Follow me on Plurk</a>
1166- <a href="#" class="zocial grooveshark icon">Follow me on Grooveshark</a>
1167- <a href="#" class="zocial blogger icon">Post on Blogger</a>
1168- <a href="#" class="zocial viadeo icon">Sign in with Viadeo</a>
1169- <a href="#" class="zocial podcast icon">Subscribe to this Podcast</a>
1170- <a href="#" class="zocial fivehundredpx icon">View Portfolio on 500px</a>
1171- <a href="#" class="zocial bitcoin icon">Bitcoin accepted here</a>
1172- <a href="#" class="zocial ninetyninedesigns icon">View Portfolio on 99Designs</a>
1173- <a href="#" class="zocial stumbleupon icon">Stumble!</a>
1174- <a href="#" class="zocial itunes icon">Download on iTunes</a>
1175- <a href="#" class="zocial myspace icon">Find me on Myspace</a>
1176- <a href="#" class="zocial windows icon">Sign in with Windows Live</a>
1177- <a href="#" class="zocial eventful icon">Find Events with Eventful</a>
1178- <a href="#" class="zocial klout icon">Influence with Klout</a>
1179- <a href="#" class="zocial xing icon">Sign in with Xing</a>
1180- <a href="#" class="zocial flickr icon">Upload to Flickr</a>
1181- <a href="#" class="zocial delicious icon">Sign in with Del.icio.us</a>
1182- <a href="#" class="zocial googleplay icon">Download from Google Play</a>
1183- <a href="#" class="zocial opentable icon">Reserve with OpenTable</a>
1184- <a href="#" class="zocial digg icon">Digg this</a>
1185- <a href="#" class="zocial reddit icon">Share on Reddit</a>
1186- <a href="#" class="zocial angellist icon">Fund us on AngelList</a>
1187- <a href="#" class="zocial instagram icon">Sign-in with Instagram</a>
1188- <a href="#" class="zocial call icon">Call a phone</a>
1189- <a href="#" class="zocial email icon">Send a message</a>
1190- <a href="#" class="zocial cal icon">Add to calendar</a>
1191- <a href="#" class="zocial print icon">Print this page</a>
1192- <a href="#" class="zocial cart icon">Add to cart</a>
1193-
1194-
1195-
1196- <p>Thanks to <a href="http://twitter.com/guillermovs" target="_blank">@guillermovs</a>, <a href="http://twitter.com/kamens" target="_blank">@kamens</a>, <a href="http://twitter.com/vizualover" target="_blank">@vizualover</a>, and <a href="http://twitter.com/leaverou" target="_blank">@leaverou</a> for code refinements and suggestions.</p>
1197-
1198- <p>Massive thanks to <a href="http://twitter.com/drewwilson" target="_blank">@drewwilson</a> for making the multi-purpose buttons possible with his incredible <a href="http://pictos.drewwilson.com">Pictos icons</a>.</p>
1199-
1200- <p>See code samples at <a href="http://zocial.smcllns.com">zocial.smcllns.com</a> &mdash; ask questions to <a href="http://twitter.com/smcllns">@smcllns</a></p>
1201-
1202- <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://zocial.smcllns.com" data-via="smcllns">Tweet</a>
1203- <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="http://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
1204-
1205- <script type="text/javascript">
1206-
1207- var _gaq = _gaq || [];
1208- _gaq.push(['_setAccount', 'UA-25061452-1']);
1209- _gaq.push(['_setDomainName', 'smcllns.com']);
1210- _gaq.push(['_setAllowHash', 'false']);
1211- _gaq.push(['_trackPageview']);
1212- _gaq.push(['_trackPageLoadTime']);
1213-
1214- (function() {
1215- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
1216- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
1217- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
1218- })();
1219-
1220- </script>
1221-
1222-</body>
1223-</html>
1224
1225=== removed directory 'auth_oauth/static/src'
1226=== removed directory 'auth_oauth/static/src/css'
1227=== removed file 'auth_oauth/static/src/css/auth_oauth.css'
1228--- auth_oauth/static/src/css/auth_oauth.css 2012-11-28 00:14:49 +0000
1229+++ auth_oauth/static/src/css/auth_oauth.css 1970-01-01 00:00:00 +0000
1230@@ -1,34 +0,0 @@
1231-.openerp .oe_application .zocial {
1232- font: white;
1233-}
1234-
1235-.openerp .zocial.openerp:before {
1236- content: "\E02E";
1237- font-style: italic;
1238- text-shadow: 0 1px 1px black;
1239-}
1240-
1241-.openerp a.zocial.openerp {
1242- border: 1px solid #222222;
1243- color: white;
1244- margin: 0;
1245- background-color: #b92020;
1246- background-image: -webkit-gradient(linear, left top, left bottom, from(#b92020), to(#600606));
1247- background-image: -webkit-linear-gradient(top, #b92020, #600606);
1248- background-image: -moz-linear-gradient(top, #b92020, #600606);
1249- background-image: -ms-linear-gradient(top, #b92020, #600606);
1250- background-image: -o-linear-gradient(top, #b92020, #600606);
1251- background-image: linear-gradient(to bottom, #b92020, #600606);
1252- -moz-border-radius: 4px;
1253- -webkit-border-radius: 4px;
1254- border-radius: 4px;
1255- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
1256- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
1257- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
1258- text-shadow: none;
1259- font-weight: normal;
1260-}
1261-
1262-.openerp .oe_login .oe_oauth_provider_login_button {
1263- margin-top: 4px;
1264-}
1265
1266=== removed directory 'auth_oauth/static/src/js'
1267=== removed file 'auth_oauth/static/src/js/auth_oauth.js'
1268--- auth_oauth/static/src/js/auth_oauth.js 2013-10-27 12:31:04 +0000
1269+++ auth_oauth/static/src/js/auth_oauth.js 1970-01-01 00:00:00 +0000
1270@@ -1,80 +0,0 @@
1271-openerp.auth_oauth = function(instance) {
1272- var _t = instance.web._t,
1273- _lt = instance.web._lt;
1274- var QWeb = instance.web.qweb;
1275-
1276- instance.web.Login.include({
1277- start: function(parent, params) {
1278- var self = this;
1279- var d = this._super.apply(this, arguments);
1280- this.$el.hide();
1281- this.$el.on('click', 'a.zocial', this.on_oauth_sign_in);
1282- this.oauth_providers = [];
1283- if(this.params.oauth_error === 1) {
1284- this.do_warn(_t("Sign up error"),_t("Sign up is not allowed on this database."), true);
1285- } else if(this.params.oauth_error === 2) {
1286- this.do_warn(_t("Authentication error"),_t("Access Denied"), true);
1287- } else if(this.params.oauth_error === 3) {
1288- this.do_warn(_t("Authentication error"),_t("You do not have access to this database or your invitation has expired. Please ask for an invitation and be sure to follow the link in your invitation email."), true);
1289- }
1290- return d.done(this.do_oauth_load).fail(function() {
1291- self.do_oauth_load([]);
1292- });
1293- },
1294- on_db_loaded: function(result) {
1295- this._super.apply(this, arguments);
1296- this.$("form [name=db]").change(this.do_oauth_load);
1297- },
1298- do_oauth_load: function() {
1299- var db = this.$("form [name=db]").val();
1300- if (db) {
1301- this.rpc("/auth_oauth/list_providers", { dbname: db }).done(this.on_oauth_loaded);
1302- } else {
1303- this.$el.show();
1304- }
1305- },
1306- on_oauth_loaded: function(result) {
1307- this.oauth_providers = result;
1308- var params = $.deparam($.param.querystring());
1309- if (this.oauth_providers.length === 1 && params.type === 'signup') {
1310- this.do_oauth_sign_in(this.oauth_providers[0]);
1311- } else {
1312- this.$el.show();
1313- this.$('.oe_oauth_provider_login_button').remove();
1314- var buttons = QWeb.render("auth_oauth.Login.button",{"widget":this});
1315- this.$(".oe_login_pane form ul").after(buttons);
1316- }
1317- },
1318- on_oauth_sign_in: function(ev) {
1319- ev.preventDefault();
1320- var index = $(ev.target).data('index');
1321- var provider = this.oauth_providers[index];
1322- return this.do_oauth_sign_in(provider);
1323- },
1324- do_oauth_sign_in: function(provider) {
1325- var return_url = _.str.sprintf('%s//%s/auth_oauth/signin', location.protocol, location.host);
1326- if (instance.session.debug) {
1327- return_url += '?debug';
1328- }
1329- var state = this._oauth_state(provider);
1330- var params = {
1331- response_type: 'token',
1332- client_id: provider.client_id,
1333- redirect_uri: return_url,
1334- scope: provider.scope,
1335- state: JSON.stringify(state),
1336- };
1337- var url = provider.auth_endpoint + '?' + $.param(params);
1338- instance.web.redirect(url);
1339- },
1340- _oauth_state: function(provider) {
1341- // return the state object sent back with the redirected uri
1342- var dbname = this.$("form [name=db]").val();
1343- return {
1344- d: dbname,
1345- p: provider.id,
1346- };
1347- },
1348- });
1349-
1350-};
1351
1352=== removed directory 'auth_oauth/static/src/xml'
1353=== removed file 'auth_oauth/static/src/xml/auth_oauth.xml'
1354--- auth_oauth/static/src/xml/auth_oauth.xml 2012-09-27 12:34:29 +0000
1355+++ auth_oauth/static/src/xml/auth_oauth.xml 1970-01-01 00:00:00 +0000
1356@@ -1,8 +0,0 @@
1357-<?xml version="1.0" encoding="UTF-8"?>
1358-<templates id="template" xml:space="preserve">
1359-<t t-name="auth_oauth.Login.button">
1360- <t t-foreach="widget.oauth_providers" t-as="p">
1361- <a href="#" t-attf-class="oe_oauth_provider_login_button #{p.css_class}" t-att-data-index="p_index"><t t-esc="p.body"/></a>
1362- </t>
1363-</t>
1364-</templates>
1365
1366=== added directory 'auth_oauth/views'
1367=== added file 'auth_oauth/views/auth_oauth_login.xml'
1368--- auth_oauth/views/auth_oauth_login.xml 1970-01-01 00:00:00 +0000
1369+++ auth_oauth/views/auth_oauth_login.xml 2014-01-31 00:21:10 +0000
1370@@ -0,0 +1,19 @@
1371+<?xml version="1.0" encoding="utf-8"?>
1372+<!-- vim:fdn=3:
1373+-->
1374+<openerp>
1375+ <data>
1376+ <template id="auth_oauth.login" inherit_id="web.login" name="OAuth Login buttons">
1377+ <xpath expr="//button[@type='submit']" position="before">
1378+ <div class="pull-right">
1379+ <div t-foreach="providers" t-as="p">
1380+ <a t-att-href="p['auth_link']" class="btn btn-link">
1381+ <i t-att-class="p['css_class']"/>
1382+ <t t-esc="p['body']"/>
1383+ </a>
1384+ </div>
1385+ </div>
1386+ </xpath>
1387+ </template>
1388+ </data>
1389+</openerp>
1390
1391=== modified file 'auth_oauth_signup/__init__.py'
1392--- auth_oauth_signup/__init__.py 2012-11-26 10:52:42 +0000
1393+++ auth_oauth_signup/__init__.py 2014-01-31 00:21:10 +0000
1394@@ -20,3 +20,4 @@
1395 ##############################################################################
1396
1397 import res_users
1398+import controllers
1399
1400=== modified file 'auth_oauth_signup/__openerp__.py'
1401--- auth_oauth_signup/__openerp__.py 2012-11-26 10:52:42 +0000
1402+++ auth_oauth_signup/__openerp__.py 2014-01-31 00:21:10 +0000
1403@@ -31,7 +31,7 @@
1404 'website': 'http://www.openerp.com',
1405 'depends': ['auth_oauth', 'auth_signup'],
1406 'data': [],
1407- 'js': ['static/src/js/auth_oauth_signup.js'],
1408+ 'js': [],
1409 'css': [],
1410 'qweb': [],
1411 'installable': True,
1412
1413=== added directory 'auth_oauth_signup/controllers'
1414=== added file 'auth_oauth_signup/controllers/__init__.py'
1415--- auth_oauth_signup/controllers/__init__.py 1970-01-01 00:00:00 +0000
1416+++ auth_oauth_signup/controllers/__init__.py 2014-01-31 00:21:10 +0000
1417@@ -0,0 +1,3 @@
1418+import main
1419+
1420+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
1421
1422=== added file 'auth_oauth_signup/controllers/main.py'
1423--- auth_oauth_signup/controllers/main.py 1970-01-01 00:00:00 +0000
1424+++ auth_oauth_signup/controllers/main.py 2014-01-31 00:21:10 +0000
1425@@ -0,0 +1,20 @@
1426+import openerp
1427+import werkzeug
1428+
1429+from openerp.http import request
1430+
1431+class OAuthSignupLogin(openerp.addons.web.controllers.main.Home):
1432+ def list_providers(self):
1433+ providers = super(OAuthSignupLogin, self).list_providers()
1434+ if len(providers) == 1 and request.params.get('mode') == 'signup':
1435+ werkzeug.exceptions.abort(werkzeug.utils.redirect(providers[0]['auth_link'], 303))
1436+ return providers
1437+
1438+ def get_state(self, provider):
1439+ state = super(OAuthSignupLogin, self).get_state(provider)
1440+ token = request.params.get('token')
1441+ if token:
1442+ state['t'] = token
1443+ return state
1444+
1445+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
1446
1447=== removed directory 'auth_oauth_signup/static'
1448=== removed directory 'auth_oauth_signup/static/src'
1449=== removed directory 'auth_oauth_signup/static/src/js'
1450=== removed file 'auth_oauth_signup/static/src/js/auth_oauth_signup.js'
1451--- auth_oauth_signup/static/src/js/auth_oauth_signup.js 2012-11-26 10:52:42 +0000
1452+++ auth_oauth_signup/static/src/js/auth_oauth_signup.js 1970-01-01 00:00:00 +0000
1453@@ -1,14 +0,0 @@
1454-openerp.auth_oauth_signup = function(instance) {
1455-
1456- // override Login._oauth_state to add the signup token in the state
1457- instance.web.Login.include({
1458- _oauth_state: function(provider) {
1459- var state = this._super.apply(this, arguments);
1460- if (this.params.token) {
1461- state.t = this.params.token;
1462- }
1463- return state;
1464- },
1465- });
1466-
1467-};
1468
1469=== modified file 'auth_openid/controllers/main.py'
1470--- auth_openid/controllers/main.py 2013-11-27 15:32:57 +0000
1471+++ auth_openid/controllers/main.py 2014-01-31 00:21:10 +0000
1472@@ -23,7 +23,6 @@
1473 import os
1474 import tempfile
1475 import getpass
1476-import urllib
1477
1478 import werkzeug.urls
1479 import werkzeug.exceptions
1480@@ -79,7 +78,7 @@
1481 # update fields
1482 for attr in ['claimed_id', 'identity']:
1483 value = message.getArg(consumer.OPENID2_NS, attr, '')
1484- value = 'https://www.google.com/accounts/o8/user-xrds?uri=%s' % urllib.quote_plus(value)
1485+ value = 'https://www.google.com/accounts/o8/user-xrds?uri=%s' % werkzeug.url_quote_plus(value)
1486 message.setArg(consumer.OPENID2_NS, attr, value)
1487
1488 # now, resign the message
1489
1490=== modified file 'auth_openid/static/src/js/auth_openid.js'
1491--- auth_openid/static/src/js/auth_openid.js 2013-10-27 12:31:04 +0000
1492+++ auth_openid/static/src/js/auth_openid.js 2014-01-31 00:21:10 +0000
1493@@ -3,6 +3,7 @@
1494
1495 var QWeb = instance.web.qweb;
1496
1497+/* TODO: make this a server side controller
1498 instance.web.Login = instance.web.Login.extend({
1499 start: function() {
1500 var self = this;
1501@@ -149,6 +150,7 @@
1502 }
1503
1504 });
1505+*/
1506
1507
1508 };
1509
1510=== modified file 'auth_signup/__openerp__.py'
1511--- auth_signup/__openerp__.py 2013-10-27 12:31:04 +0000
1512+++ auth_signup/__openerp__.py 2014-01-31 00:21:10 +0000
1513@@ -34,13 +34,14 @@
1514 'depends': [
1515 'base_setup',
1516 'email_template',
1517+ 'web',
1518 ],
1519 'data': [
1520 'auth_signup_data.xml',
1521 'res_config.xml',
1522 'res_users_view.xml',
1523+ 'views/auth_signup_login.xml',
1524 ],
1525 'js': ['static/src/js/auth_signup.js'],
1526- 'qweb': ['static/src/xml/auth_signup.xml'],
1527 'bootstrap': True,
1528 }
1529
1530=== modified file 'auth_signup/auth_signup_data.xml'
1531--- auth_signup/auth_signup_data.xml 2013-12-04 13:00:23 +0000
1532+++ auth_signup/auth_signup_data.xml 2014-01-31 00:21:10 +0000
1533@@ -10,7 +10,7 @@
1534 <field name="password"></field>
1535 <field name="active" eval="False"/>
1536 <!-- Avoid auto-including this user in any default group, just like a typical portal member -->
1537- <field name="groups_id" eval="[(5,)]"/>
1538+ <field name="groups_id" eval="[(4,ref('base.group_portal'))]"/>
1539 <!-- allow signuped users to have a alias -->
1540 <field name="alias_name">_usertemplate</field>
1541 </record>
1542
1543=== modified file 'auth_signup/controllers/main.py'
1544--- auth_signup/controllers/main.py 2013-11-27 15:32:57 +0000
1545+++ auth_signup/controllers/main.py 2014-01-31 00:21:10 +0000
1546@@ -21,64 +21,77 @@
1547 import logging
1548
1549 import openerp
1550+import openerp.addons.web.controllers.main as webmain
1551+from openerp.addons.auth_signup.res_users import SignupError
1552 from openerp import http
1553-from openerp.http import request
1554-from openerp.modules.registry import RegistryManager
1555-from ..res_users import SignupError
1556+from openerp.http import request, LazyResponse
1557+from openerp.tools.translate import _
1558+from openerp.tools import exception_to_unicode
1559
1560 _logger = logging.getLogger(__name__)
1561
1562-class Controller(http.Controller):
1563-
1564- @http.route('/auth_signup/get_config', type='json', auth="none")
1565- def get_config(self, dbname):
1566- """ retrieve the module config (which features are enabled) for the login page """
1567- registry = RegistryManager.get(dbname)
1568- with registry.cursor() as cr:
1569- icp = registry.get('ir.config_parameter')
1570- config = {
1571- 'signup': icp.get_param(cr, openerp.SUPERUSER_ID, 'auth_signup.allow_uninvited') == 'True',
1572- 'reset_password': icp.get_param(cr, openerp.SUPERUSER_ID, 'auth_signup.reset_password') == 'True',
1573- }
1574- return config
1575-
1576- @http.route('/auth_signup/retrieve', type='json', auth="none")
1577- def retrieve(self, dbname, token):
1578- """ retrieve the user info (name, login or email) corresponding to a signup token """
1579- registry = RegistryManager.get(dbname)
1580- with registry.cursor() as cr:
1581- res_partner = registry.get('res.partner')
1582- user_info = res_partner.signup_retrieve_info(cr, openerp.SUPERUSER_ID, token)
1583- return user_info
1584-
1585- @http.route('/auth_signup/signup', type='json', auth="none")
1586- def signup(self, dbname, token, **values):
1587- """ sign up a user (new or existing)"""
1588- try:
1589- self._signup_with_values(dbname, token, values)
1590- except SignupError, e:
1591- return {'error': openerp.tools.exception_to_unicode(e)}
1592- return {}
1593-
1594- def _signup_with_values(self, dbname, token, values):
1595- registry = RegistryManager.get(dbname)
1596- with registry.cursor() as cr:
1597- res_users = registry.get('res.users')
1598- res_users.signup(cr, openerp.SUPERUSER_ID, values, token)
1599-
1600- @http.route('/auth_signup/reset_password', type='json', auth="none")
1601- def reset_password(self, dbname, login):
1602- """ retrieve user, and perform reset password """
1603- registry = RegistryManager.get(dbname)
1604- with registry.cursor() as cr:
1605+class Home(openerp.addons.web.controllers.main.Home):
1606+
1607+ @http.route()
1608+ def web_login(self, *args, **kw):
1609+ mode = request.params.get('mode')
1610+ qcontext = request.params.copy()
1611+ response = webmain.render_bootstrap_template(request.session.db, 'auth_signup.signup', qcontext, lazy=True)
1612+ token = qcontext.get('token', None)
1613+ token_infos = None
1614+ if token:
1615 try:
1616- res_users = registry.get('res.users')
1617- res_users.reset_password(cr, openerp.SUPERUSER_ID, login)
1618- cr.commit()
1619- except Exception as e:
1620- # signup error
1621- _logger.exception('error when resetting password')
1622- raise(e)
1623- return True
1624+ # retrieve the user info (name, login or email) corresponding to a signup token
1625+ res_partner = request.registry.get('res.partner')
1626+ token_infos = res_partner.signup_retrieve_info(request.cr, openerp.SUPERUSER_ID, token)
1627+ for k, v in token_infos.items():
1628+ qcontext.setdefault(k, v)
1629+ except:
1630+ qcontext['error'] = _("Invalid signup token")
1631+ response.params['template'] = 'web.login'
1632+ return response
1633+
1634+ # retrieve the module config (which features are enabled) for the login page
1635+ icp = request.registry.get('ir.config_parameter')
1636+ config = {
1637+ 'signup': icp.get_param(request.cr, openerp.SUPERUSER_ID, 'auth_signup.allow_uninvited') == 'True',
1638+ 'reset': icp.get_param(request.cr, openerp.SUPERUSER_ID, 'auth_signup.reset_password') == 'True',
1639+ }
1640+ qcontext.update(config)
1641+
1642+ if 'error' in qcontext or mode not in ('reset', 'signup') or (not token and not config[mode]):
1643+ response = super(Home, self).web_login(*args, **kw)
1644+ if isinstance(response, LazyResponse):
1645+ response.params['values'].update(config)
1646+ return response
1647+
1648+ if request.httprequest.method == 'GET':
1649+ if token_infos:
1650+ qcontext.update(token_infos)
1651+ else:
1652+ res_users = request.registry.get('res.users')
1653+ login = request.params.get('login')
1654+ if mode == 'reset' and not token:
1655+ try:
1656+ res_users.reset_password(request.cr, openerp.SUPERUSER_ID, login)
1657+ qcontext['message'] = _("An email has been sent with credentials to reset your password")
1658+ response.params['template'] = 'web.login'
1659+ except Exception:
1660+ qcontext['error'] = _("Could not reset your password")
1661+ _logger.exception('error when resetting password')
1662+ else:
1663+ values = dict((key, qcontext.get(key)) for key in ('login', 'name', 'password'))
1664+ try:
1665+ self._signup_with_values(token, values)
1666+ request.cr.commit()
1667+ except SignupError, e:
1668+ qcontext['error'] = exception_to_unicode(e)
1669+ return super(Home, self).web_login(*args, **kw)
1670+
1671+ return response
1672+
1673+ def _signup_with_values(self, token, values):
1674+ request.registry['res.users'].signup(request.cr, openerp.SUPERUSER_ID, values, token)
1675+
1676
1677 # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
1678
1679=== modified file 'auth_signup/res_config.xml'
1680--- auth_signup/res_config.xml 2012-12-12 12:40:49 +0000
1681+++ auth_signup/res_config.xml 2014-01-31 00:21:10 +0000
1682@@ -7,7 +7,7 @@
1683 <field name="model">base.config.settings</field>
1684 <field name="inherit_id" ref="base_setup.view_general_configuration"/>
1685 <field name="arch" type="xml">
1686- <xpath expr="//field[@name='module_portal_anonymous']/.." position="after">
1687+ <xpath expr="//field[@name='module_portal']/.." position="after">
1688 <div>
1689 <field name="auth_signup_reset_password" class="oe_inline"/>
1690 <label for="auth_signup_reset_password"/>
1691
1692=== modified file 'auth_signup/res_users.py'
1693--- auth_signup/res_users.py 2013-12-04 13:00:23 +0000
1694+++ auth_signup/res_users.py 2014-01-31 00:21:10 +0000
1695@@ -66,19 +66,20 @@
1696 self.signup_prepare(cr, uid, [partner.id], context=context)
1697 partner.refresh()
1698
1699- # the parameters to encode for the query and fragment part of url
1700- query = {'db': cr.dbname}
1701+ # the parameters to encode for the query
1702+ query = dict(db=cr.dbname)
1703 signup_type = context.get('signup_force_type_in_url', partner.signup_type or '')
1704- fragment = {'action': action, 'type': signup_type}
1705+ if signup_type:
1706+ query['mode'] = signup_type
1707
1708 if partner.signup_token and signup_type:
1709- fragment['token'] = partner.signup_token
1710+ query['token'] = partner.signup_token
1711 elif partner.user_ids:
1712- fragment['db'] = cr.dbname
1713- fragment['login'] = partner.user_ids[0].login
1714+ query['login'] = partner.user_ids[0].login
1715 else:
1716 continue # no signup token, no user, thus no signup url!
1717
1718+ fragment = dict()
1719 if view_type:
1720 fragment['view_type'] = view_type
1721 if menu_id:
1722@@ -88,7 +89,7 @@
1723 if res_id:
1724 fragment['id'] = res_id
1725
1726- res[partner.id] = urljoin(base_url, "?%s#%s" % (urlencode(query), urlencode(fragment)))
1727+ res[partner.id] = urljoin(base_url, "/web/login?%s#%s" % (urlencode(query), urlencode(fragment)))
1728
1729 return res
1730
1731@@ -262,6 +263,7 @@
1732 template = False
1733 if context.get('create_user'):
1734 try:
1735+ # get_object() raises ValueError if record does not exist
1736 template = self.pool.get('ir.model.data').get_object(cr, uid, 'auth_signup', 'set_password_email')
1737 except ValueError:
1738 pass
1739@@ -272,10 +274,7 @@
1740 for user in self.browse(cr, uid, ids, context):
1741 if not user.email:
1742 raise osv.except_osv(_("Cannot send email: user has no email address."), user.name)
1743- try:
1744- self.pool.get('email.template').send_mail(cr, uid, template.id, user.id, force_send=True, raise_exception=True, context=context)
1745- except Exception:
1746- raise
1747+ self.pool.get('email.template').send_mail(cr, uid, template.id, user.id, force_send=True, raise_exception=True, context=context)
1748
1749 def create(self, cr, uid, values, context=None):
1750 if context is None:
1751
1752=== modified file 'auth_signup/static/src/js/auth_signup.js'
1753--- auth_signup/static/src/js/auth_signup.js 2013-11-27 15:32:57 +0000
1754+++ auth_signup/static/src/js/auth_signup.js 2014-01-31 00:21:10 +0000
1755@@ -1,186 +1,19 @@
1756 openerp.auth_signup = function(instance) {
1757- instance.auth_signup = instance.auth_signup || {};
1758- var _t = instance.web._t;
1759-
1760- instance.web.Login.include({
1761- start: function() {
1762- var self = this;
1763- this.signup_enabled = false;
1764- this.reset_password_enabled = false;
1765- return this._super().always(function() {
1766-
1767- // Switches the login box to the select mode whith mode == [default|signup|reset]
1768- self.on('change:login_mode', self, function() {
1769- var mode = self.get('login_mode') || 'default';
1770- self.$('*[data-modes]').each(function() {
1771- var modes = $(this).data('modes').split(/\s+/);
1772- $(this).toggle(modes.indexOf(mode) > -1);
1773- });
1774- self.$('a.oe_signup_signup:visible').toggle(self.signup_enabled);
1775- self.$('a.oe_signup_reset_password:visible').toggle(self.reset_password_enabled);
1776- });
1777-
1778- // to switch between the signup and regular login form
1779- self.$('a.oe_signup_signup').click(function(ev) {
1780- self.set('login_mode', 'signup');
1781- return false;
1782- });
1783- self.$('a.oe_signup_back').click(function(ev) {
1784- self.set('login_mode', 'default');
1785- delete self.params.token;
1786- return false;
1787- });
1788-
1789- var dbname = self.selected_db;
1790-
1791- // if there is an error message in params, show it then forget it
1792- if (self.params.error_message) {
1793- self.show_error(self.params.error_message);
1794- delete self.params.error_message;
1795- }
1796-
1797- if (dbname && self.params.login) {
1798- self.$("form input[name=login]").val(self.params.login);
1799- }
1800-
1801- // bind reset password link
1802- self.$('a.oe_signup_reset_password').click(self.do_reset_password);
1803-
1804- if (dbname) {
1805- self.rpc("/auth_signup/get_config", {dbname: dbname}).then(function(result) {
1806- self.signup_enabled = result.signup;
1807- self.reset_password_enabled = result.reset_password;
1808- if (!self.signup_enabled || self.$("form input[name=login]").val()){
1809- self.set('login_mode', self.params.type || 'default');
1810- } else {
1811- self.set('login_mode', 'signup');
1812- }
1813-
1814- // in case of a signup, retrieve the user information from the token
1815- if (self.params.token) {
1816- self.rpc("/auth_signup/retrieve", {dbname: dbname, token: self.params.token})
1817- .then(self.on_token_loaded, self.on_token_failed);
1818- }
1819-
1820- });
1821- } else {
1822- // TODO: support multiple database mode
1823- self.set('login_mode', self.params.type || 'default');
1824- }
1825- });
1826- },
1827-
1828- on_token_loaded: function(result) {
1829- // select the right the database
1830- this.selected_db = result.db;
1831- this.on_db_loaded([result.db]);
1832- if (result.token) {
1833- // switch to signup mode, set user name and login
1834- this.set('login_mode', (this.params.type === 'reset' ? 'reset' : 'signup'));
1835- this.$("form input[name=name]").val(result.name).attr("readonly", "readonly");
1836- if (result.login) {
1837- this.$("form input[name=login]").val(result.login).attr("readonly", "readonly");
1838- } else {
1839- this.$("form input[name=login]").val(result.email);
1840- }
1841- } else {
1842- // remain in login mode, set login if present
1843- delete this.params.token;
1844- this.set('login_mode', 'default');
1845- this.$("form input[name=login]").val(result.login || "");
1846- }
1847- },
1848-
1849- on_token_failed: function(result, ev) {
1850- if (ev) {
1851- ev.preventDefault();
1852- }
1853- this.show_error(_t("Invalid signup token"));
1854- delete this.params.db;
1855- delete this.params.token;
1856- this.set('login_mode', 'default');
1857- },
1858-
1859- get_params: function(){
1860- // signup user (or reset password)
1861- var db = this.$("form [name=db]").val();
1862- var name = this.$("form input[name=name]").val();
1863- var login = this.$("form input[name=login]").val();
1864- var password = this.$("form input[name=password]").val();
1865- var confirm_password = this.$("form input[name=confirm_password]").val();
1866- if (!db) {
1867- this.do_warn(_t("Login"), _t("No database selected !"));
1868- return false;
1869- } else if (!name) {
1870- this.do_warn(_t("Login"), _t("Please enter a name."));
1871- return false;
1872- } else if (!login) {
1873- this.do_warn(_t("Login"), _t("Please enter a username."));
1874- return false;
1875- } else if (!password || !confirm_password) {
1876- this.do_warn(_t("Login"), _t("Please enter a password and confirm it."));
1877- return false;
1878- } else if (password !== confirm_password) {
1879- this.do_warn(_t("Login"), _t("Passwords do not match; please retype them."));
1880- return false;
1881- }
1882- var params = {
1883- dbname : db,
1884- token: this.params.token || "",
1885- name: name,
1886- login: login,
1887- password: password,
1888- };
1889- return params;
1890- },
1891-
1892- on_submit: function(ev) {
1893- if (ev) {
1894- ev.preventDefault();
1895- }
1896- var login_mode = this.get('login_mode');
1897- if (login_mode === 'signup' || login_mode === 'reset') {
1898- var params = this.get_params();
1899- if (_.isEmpty(params)){
1900- return false;
1901- }
1902- var self = this,
1903- super_ = this._super;
1904- this.rpc('/auth_signup/signup', params)
1905- .done(function(result) {
1906- if (result.error) {
1907- self.show_error(result.error);
1908- } else {
1909- super_.apply(self, [ev]);
1910- }
1911- });
1912- } else {
1913- // regular login
1914- this._super(ev);
1915- }
1916- },
1917-
1918- do_reset_password: function(ev) {
1919- if (ev) {
1920- ev.preventDefault();
1921- }
1922- var self = this;
1923- var db = this.$("form [name=db]").val();
1924- var login = this.$("form input[name=login]").val();
1925- if (!db) {
1926- this.do_warn(_t("Login"), _t("No database selected !"));
1927- return $.Deferred().reject();
1928- } else if (!login) {
1929- this.do_warn(_t("Login"), _t("Please enter a username or email address."));
1930- return $.Deferred().reject();
1931- }
1932- return self.rpc("/auth_signup/reset_password", { dbname: db, login: login }).done(function(result) {
1933- self.show_error(_t("An email has been sent with credentials to reset your password"));
1934- self.set('login_mode', 'default');
1935- }).fail(function(result, ev) {
1936- ev.preventDefault();
1937- self.show_error(result.message);
1938- });
1939+ openerp.web.LoginForm.include({
1940+ start: function () {
1941+ var self = this;
1942+ this.$el.on('submit', function () {
1943+ var password = self.get_password_field('password');
1944+ var confirm_password = self.get_password_field('confirm_password');
1945+ if (password && confirm_password && (password.value != confirm_password.value)) {
1946+ alert("Passwords do not match; please retype them.");
1947+ return false;
1948+ }
1949+ });
1950+ },
1951+ get_password_field: function (field) {
1952+ var selector = 'input[name="' + field + '"][type="password"]:visible';
1953+ return this.$(selector)[0];
1954 },
1955 });
1956 };
1957
1958=== removed directory 'auth_signup/static/src/xml'
1959=== removed file 'auth_signup/static/src/xml/auth_signup.xml'
1960--- auth_signup/static/src/xml/auth_signup.xml 2013-10-27 12:31:04 +0000
1961+++ auth_signup/static/src/xml/auth_signup.xml 1970-01-01 00:00:00 +0000
1962@@ -1,39 +0,0 @@
1963-<?xml version="1.0" encoding="UTF-8"?>
1964-<!-- vim:fdl=1:
1965--->
1966-<templates id="template" xml:space="preserve">
1967-
1968- <t t-extend="Login">
1969- <t t-jquery="form ul:first li:contains('Username')" t-operation="before">
1970- <li data-modes="signup reset">Name</li>
1971- <li data-modes="signup reset"><input name="name" type="text"/></li>
1972- </t>
1973- <t t-jquery="form ul:first li:contains('Username')" t-operation="replace">
1974- <li data-modes="default">Username</li>
1975- <li data-modes="signup reset">Username (Email)</li>
1976- </t>
1977- <t t-jquery="form ul:first li:has(input[name=login], input[name=password]), form ul:first li:contains('Password')">
1978- this.attr('data-modes', 'default signup reset');
1979- </t>
1980- <t t-jquery="form ul:first li:has(input[name=password])" t-operation="after">
1981- <li data-modes="signup reset">Confirm Password</li>
1982- <li data-modes="signup reset"><input name="confirm_password" type="password"/></li>
1983- </t>
1984- <t t-jquery="form ul:first li:has(button[name=submit])" t-operation="replace">
1985- <li>
1986- <button name="submit">
1987- <span data-modes="default">Log in</span>
1988- <span data-modes="signup">Sign Up</span>
1989- <span data-modes="reset">Reset password</span>
1990- </button>
1991- <a class="oe_signup_signup" data-modes="default" href="#">Sign Up</a>
1992- <a class="oe_signup_back" data-modes="signup reset" href="#">Back to Login</a>
1993- <a class="oe_signup_reset_password" data-modes="default" href="#">Reset password</a>
1994- </li>
1995- </t>
1996- <t t-jquery=".oe_login_manage_db">
1997- this.attr('data-modes', 'default');
1998- </t>
1999- </t>
2000-
2001-</templates>
2002
2003=== added directory 'auth_signup/views'
2004=== added file 'auth_signup/views/auth_signup_login.xml'
2005--- auth_signup/views/auth_signup_login.xml 1970-01-01 00:00:00 +0000
2006+++ auth_signup/views/auth_signup_login.xml 2014-01-31 00:21:10 +0000
2007@@ -0,0 +1,91 @@
2008+<?xml version="1.0" encoding="utf-8"?>
2009+<!-- vim:fdn=3:
2010+-->
2011+<openerp>
2012+ <data>
2013+ <template id="auth_signup.login" inherit_id="web.login" name="Sign up - Reset Password">
2014+ <xpath expr="//button[@type='submit']" position="before">
2015+ <a t-if="signup" t-attf-href="?mode=signup{{ '&amp;debug' if debug else '' }}" class="btn btn-link pull-right">Sign up</a>
2016+ <a t-if="reset" t-attf-href="?mode=reset{{ '&amp;debug' if debug else '' }}" class="btn btn-link pull-right">Reset Password</a>
2017+ </xpath>
2018+ </template>
2019+
2020+ <template id="auth_signup.signup" name="Sign up">
2021+ <t t-call="web.login_layout">
2022+ <t t-set="head">
2023+ <t t-foreach="css" t-as="css_file">
2024+ <link rel="stylesheet" t-att-href="css_file"/>
2025+ </t>
2026+ <t t-foreach="js" t-as="js_file">
2027+ <script type="text/javascript" t-att-src="js_file"></script>
2028+ </t>
2029+ </t>
2030+ <script type="text/javascript">
2031+ $(function() {
2032+ var s = new openerp.init(<t t-raw="modules"/>);
2033+ var login_form = new openerp.web.LoginForm($('.oe_signup_form'));
2034+ });
2035+ </script>
2036+
2037+ <t t-set="reset_without_token" t-value="mode == 'reset' and not token"/>
2038+
2039+ <form class="oe_signup_form" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post">
2040+ <t t-call="web.database_select"/>
2041+
2042+ <div class="form-group field-name" t-if="not reset_without_token">
2043+ <label for="name" class="control-label">Your Name</label>
2044+ <input type="text" name="name" t-att-value="name" id="name" class="form-control" placeholder="e.g. John Doe"
2045+ required="required" autofocus="autofocus" t-att-disabled="'disabled' if mode == 'reset' and token else None"/>
2046+ </div>
2047+
2048+ <div class="form-group field-login">
2049+ <label for="login" class="control-label">Your Email</label>
2050+ <input type="text" name="login" t-att-value="login" id="login" class="form-control"
2051+ t-att-autofocus="'autofocus' if reset_without_token else None"
2052+ required="required" t-att-disabled="'disabled' if mode == 'reset' and token else None"/>
2053+ <input type="hidden" name="login" t-att-value="login" t-if="mode == 'reset' and token"/>
2054+ </div>
2055+
2056+ <div class="form-group field-password" t-if="not reset_without_token">
2057+ <label for="password" class="control-label">Password</label>
2058+ <input type="password" name="password" id="password" class="form-control"
2059+ required="required" t-att-autofocus="'autofocus' if mode == 'reset' and token else None"/>
2060+ </div>
2061+
2062+ <div class="form-group field-confirm_password" t-if="not reset_without_token">
2063+ <label for="confirm_password" class="control-label">Confirm Password</label>
2064+ <input type="password" name="confirm_password" id="confirm_password" class="form-control" required="required"/>
2065+ </div>
2066+
2067+ <p class="alert alert-danger" t-if="error">
2068+ <t t-esc="error"/>
2069+ </p>
2070+ <p class="alert alert-success" t-if="message">
2071+ <t t-esc="message"/>
2072+ </p>
2073+
2074+ <input type="hidden" name="redirect" t-att-value="redirect"/>
2075+ <input type="hidden" name="mode" t-att-value="mode"/>
2076+ <input type="hidden" name="token" t-att-value="token"/>
2077+ <div class="clearfix oe_login_buttons">
2078+ <a href="/web/login" class="btn btn-link pull-right">Back to Login</a>
2079+ <button type="submit" class="btn btn-primary pull-left">
2080+ <t t-if="mode == 'signup'">Sign up</t>
2081+ <t t-if="mode == 'reset'">Reset password</t>
2082+ </button>
2083+ </div>
2084+
2085+ </form>
2086+ <div class="oe_single_form_footer" t-if="not disable_footer">
2087+ <t t-if="not disable_database_manager">
2088+ <a class="oe_login_manage_db" t-attf-href="/web/database/manager{{ '?debug' if debug else '' }}">Manage Databases</a>
2089+ <span class="oe_footer_seperator"> | </span>
2090+ </t>
2091+ <a href="http://www.openerp.com" target="_blank">Powered by <span>OpenERP</span></a>
2092+ </div>
2093+
2094+ </t>
2095+ </template>
2096+
2097+ </data>
2098+</openerp>
2099
2100=== added directory 'base_geolocalize'
2101=== added file 'base_geolocalize/__init__.py'
2102--- base_geolocalize/__init__.py 1970-01-01 00:00:00 +0000
2103+++ base_geolocalize/__init__.py 2014-01-31 00:21:10 +0000
2104@@ -0,0 +1,22 @@
2105+# -*- coding: utf-8 -*-
2106+##############################################################################
2107+#
2108+# OpenERP, Open Source Management Solution
2109+# Copyright (C) 2013_Today OpenERP SA (<http://www.openerp.com>).
2110+#
2111+# This program is free software: you can redistribute it and/or modify
2112+# it under the terms of the GNU Affero General Public License as
2113+# published by the Free Software Foundation, either version 3 of the
2114+# License, or (at your option) any later version.
2115+#
2116+# This program is distributed in the hope that it will be useful,
2117+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2118+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2119+# GNU Affero General Public License for more details.
2120+#
2121+# You should have received a copy of the GNU Affero General Public License
2122+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2123+#
2124+##############################################################################
2125+
2126+import models
2127
2128=== added file 'base_geolocalize/__openerp__.py'
2129--- base_geolocalize/__openerp__.py 1970-01-01 00:00:00 +0000
2130+++ base_geolocalize/__openerp__.py 2014-01-31 00:21:10 +0000
2131@@ -0,0 +1,44 @@
2132+# -*- coding: utf-8 -*-
2133+##############################################################################
2134+#
2135+# OpenERP, Open Source Management Solution
2136+# Copyright (C) 2013_Today OpenERP SA (<http://www.openerp.com>).
2137+#
2138+# This program is free software: you can redistribute it and/or modify
2139+# it under the terms of the GNU Affero General Public License as
2140+# published by the Free Software Foundation, either version 3 of the
2141+# License, or (at your option) any later version.
2142+#
2143+# This program is distributed in the hope that it will be useful,
2144+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2145+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2146+# GNU Affero General Public License for more details.
2147+#
2148+# You should have received a copy of the GNU Affero General Public License
2149+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2150+#
2151+##############################################################################
2152+
2153+
2154+{
2155+ 'name': 'Partners Geo-Localization',
2156+ 'version': '1.0',
2157+ 'category': 'Customer Relationship Management',
2158+ 'description': """
2159+Partners geolocalization
2160+========================
2161+ """,
2162+ 'author': 'OpenERP SA',
2163+ 'depends': ['crm'],
2164+ 'demo': [
2165+ ],
2166+ 'data': [
2167+ 'views/res_partner_view.xml',
2168+ ],
2169+ 'test': [],
2170+ 'installable': True,
2171+ 'auto_install': False,
2172+ 'images': [],
2173+}
2174+
2175+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2176
2177=== added directory 'base_geolocalize/models'
2178=== added file 'base_geolocalize/models/__init__.py'
2179--- base_geolocalize/models/__init__.py 1970-01-01 00:00:00 +0000
2180+++ base_geolocalize/models/__init__.py 2014-01-31 00:21:10 +0000
2181@@ -0,0 +1,1 @@
2182+import res_partner
2183
2184=== added file 'base_geolocalize/models/res_partner.py'
2185--- base_geolocalize/models/res_partner.py 1970-01-01 00:00:00 +0000
2186+++ base_geolocalize/models/res_partner.py 2014-01-31 00:21:10 +0000
2187@@ -0,0 +1,88 @@
2188+# -*- coding: utf-8 -*-
2189+##############################################################################
2190+#
2191+# OpenERP, Open Source Management Solution
2192+# Copyright (C) 2013_Today OpenERP SA (<http://www.openerp.com>).
2193+#
2194+# This program is free software: you can redistribute it and/or modify
2195+# it under the terms of the GNU Affero General Public License as
2196+# published by the Free Software Foundation, either version 3 of the
2197+# License, or (at your option) any later version.
2198+#
2199+# This program is distributed in the hope that it will be useful,
2200+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2201+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2202+# GNU Affero General Public License for more details.
2203+#
2204+# You should have received a copy of the GNU Affero General Public License
2205+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2206+#
2207+##############################################################################
2208+
2209+try:
2210+ import simplejson as json
2211+except ImportError:
2212+ import json # noqa
2213+import urllib
2214+
2215+from openerp.osv import osv, fields
2216+from openerp import tools
2217+from openerp.tools.translate import _
2218+
2219+
2220+def geo_find(addr):
2221+ url = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address='
2222+ url += urllib.quote(addr.encode('utf8'))
2223+
2224+ try:
2225+ result = json.load(urllib.urlopen(url))
2226+ except Exception, e:
2227+ raise osv.except_osv(_('Network error'),
2228+ _('Cannot contact geolocation servers. Please make sure that your internet connection is up and running (%s).') % e)
2229+ if result['status'] != 'OK':
2230+ return None
2231+
2232+ try:
2233+ geo = result['results'][0]['geometry']['location']
2234+ return float(geo['lat']), float(geo['lng'])
2235+ except (KeyError, ValueError):
2236+ return None
2237+
2238+
2239+def geo_query_address(street=None, zip=None, city=None, state=None, country=None):
2240+ if country and ',' in country and (country.endswith(' of') or country.endswith(' of the')):
2241+ # put country qualifier in front, otherwise GMap gives wrong results,
2242+ # e.g. 'Congo, Democratic Republic of the' => 'Democratic Republic of the Congo'
2243+ country = '{1} {0}'.format(*country.split(',', 1))
2244+ return tools.ustr(', '.join(filter(None, [street,
2245+ ("%s %s" % (zip or '', city or '')).strip(),
2246+ state,
2247+ country])))
2248+
2249+
2250+class res_partner(osv.osv):
2251+ _inherit = "res.partner"
2252+
2253+ _columns = {
2254+ 'partner_latitude': fields.float('Geo Latitude'),
2255+ 'partner_longitude': fields.float('Geo Longitude'),
2256+ 'date_localization': fields.date('Geo Localization Date'),
2257+ }
2258+
2259+ def geo_localize(self, cr, uid, ids, context=None):
2260+ # Don't pass context to browse()! We need country names in english below
2261+ for partner in self.browse(cr, uid, ids):
2262+ if not partner:
2263+ continue
2264+ result = geo_find(geo_query_address(street=partner.street,
2265+ zip=partner.zip,
2266+ city=partner.city,
2267+ state=partner.state_id.name,
2268+ country=partner.country_id.name))
2269+ if result:
2270+ self.write(cr, uid, [partner.id], {
2271+ 'partner_latitude': result[0],
2272+ 'partner_longitude': result[1],
2273+ 'date_localization': fields.date.context_today(self, cr, uid, context=context)
2274+ }, context=context)
2275+ return True
2276
2277=== added directory 'base_geolocalize/views'
2278=== added file 'base_geolocalize/views/res_partner_view.xml'
2279--- base_geolocalize/views/res_partner_view.xml 1970-01-01 00:00:00 +0000
2280+++ base_geolocalize/views/res_partner_view.xml 2014-01-31 00:21:10 +0000
2281@@ -0,0 +1,30 @@
2282+<?xml version="1.0"?>
2283+<openerp>
2284+ <data>
2285+
2286+ <record id="view_crm_partner_geo_form" model="ir.ui.view">
2287+ <field name="name">res.partner.geo.inherit</field>
2288+ <field name="model">res.partner</field>
2289+ <field name="inherit_id" ref="base.view_partner_form"/>
2290+ <field name="arch" type="xml">
2291+ <xpath expr="//notebook[last()]" position="inside">
2292+ <page string="Geo Localization" name="geo_localization" groups="base.group_no_one">
2293+ <group colspan="2" col="2">
2294+ <separator string="Geo Localization" colspan="2"/>
2295+ <button
2296+ string="Geo Localize"
2297+ name="geo_localize"
2298+ colspan="2"
2299+ icon="gtk-apply"
2300+ type="object"/>
2301+ <field name="partner_latitude"/>
2302+ <field name="partner_longitude"/>
2303+ <field name="date_localization"/>
2304+ </group>
2305+ </page>
2306+ </xpath>
2307+ </field>
2308+ </record>
2309+
2310+ </data>
2311+</openerp>
2312\ No newline at end of file
2313
2314=== modified file 'base_import/__openerp__.py'
2315--- base_import/__openerp__.py 2013-10-27 12:31:04 +0000
2316+++ base_import/__openerp__.py 2014-01-31 00:21:10 +0000
2317@@ -31,11 +31,9 @@
2318 'security/ir.model.access.csv',
2319 ],
2320 'css': [
2321- 'static/lib/select2/select2.css',
2322 'static/src/css/import.css',
2323 ],
2324 'js': [
2325- 'static/lib/select2/select2.js',
2326 'static/lib/javascript-state-machine/state-machine.js',
2327 'static/src/js/import.js',
2328 ],
2329
2330=== removed directory 'base_import/static/lib/select2'
2331=== removed file 'base_import/static/lib/select2/LICENSE'
2332--- base_import/static/lib/select2/LICENSE 2012-09-06 10:35:16 +0000
2333+++ base_import/static/lib/select2/LICENSE 1970-01-01 00:00:00 +0000
2334@@ -1,12 +0,0 @@
2335-Copyright 2012 Igor Vaynberg
2336-
2337-Version: @@ver@@ Timestamp: @@timestamp@@
2338-
2339-Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
2340-compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
2341-
2342-http://www.apache.org/licenses/LICENSE-2.0
2343-
2344-Unless required by applicable law or agreed to in writing, software distributed under the License is
2345-distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2346-See the License for the specific language governing permissions and limitations under the License.
2347\ No newline at end of file
2348
2349=== removed file 'base_import/static/lib/select2/README.md'
2350--- base_import/static/lib/select2/README.md 2013-10-27 12:31:04 +0000
2351+++ base_import/static/lib/select2/README.md 1970-01-01 00:00:00 +0000
2352@@ -1,68 +0,0 @@
2353-Select2
2354-=================
2355-
2356-Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. Look and feel of Select2 is based on the excellent [Chosen](http://harvesthq.github.com/chosen/) library.
2357-
2358-To get started -- checkout http://ivaynberg.github.com/select2!
2359-
2360-What Does Select2 Support That Chosen Does Not?
2361--------------------------------------------------
2362-
2363-* Working with large datasets: Chosen requires the entire dataset to be loaded as `option` tags in the DOM, which limits
2364-it to working with small-ish datasets. Select2 uses a function to find results on-the-fly, which allows it to partially
2365-load results.
2366-* Paging of results: Since Select2 works with large datasets and only loads a small amount of matching results at a time
2367-it has to support paging. Select2 will call the search function when the user scrolls to the bottom of currently loaded
2368-result set allowing for the 'infinite scrolling' of results.
2369-* Custom markup for results: Chosen only supports rendering text results because that is the only markup supported by
2370-`option` tags. Select2 provides an extension point which can be used to produce any kind of markup to represent results.
2371-* Ability to add results on the fly: Select2 provides the ability to add results from the search term entered by the user, which allows it to be used for
2372-tagging.
2373-
2374-Browser Compatibility
2375---------------------
2376-* IE 8+ (7 mostly works except for [issue with z-index](https://github.com/ivaynberg/select2/issues/37))
2377-* Chrome 8+
2378-* Firefox 3.5+
2379-* Safari 3+
2380-* Opera 10.6+
2381-
2382-Integrations
2383-------------
2384-
2385-* [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / Apache Wicket)
2386-* [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
2387-* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org))
2388-* [Django](https://github.com/applegrew/django-select2)
2389-
2390-Bug tracker
2391------------
2392-
2393-Have a bug? Please create an issue here on GitHub!
2394-
2395-https://github.com/ivaynberg/select2/issues
2396-
2397-
2398-Mailing list
2399-------------
2400-
2401-Have a question? Ask on our mailing list!
2402-
2403-select2@googlegroups.com
2404-
2405-https://groups.google.com/d/forum/select2
2406-
2407-
2408-Copyright and License
2409----------------------
2410-
2411-Copyright 2012 Igor Vaynberg
2412-
2413-Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
2414-compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
2415-
2416-http://www.apache.org/licenses/LICENSE-2.0
2417-
2418-Unless required by applicable law or agreed to in writing, software distributed under the License is
2419-distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2420-See the License for the specific language governing permissions and limitations under the License.
2421\ No newline at end of file
2422
2423=== removed file 'base_import/static/lib/select2/release.sh'
2424--- base_import/static/lib/select2/release.sh 2012-09-06 10:35:16 +0000
2425+++ base_import/static/lib/select2/release.sh 1970-01-01 00:00:00 +0000
2426@@ -1,77 +0,0 @@
2427-#!/bin/bash
2428-set -e
2429-
2430-echo -n "Enter the version for this release: "
2431-
2432-read ver
2433-
2434-if [ ! $ver ]; then
2435- echo "Invalid version."
2436- exit
2437-fi
2438-
2439-name="select2"
2440-js="$name.js"
2441-mini="$name.min.js"
2442-css="$name.css"
2443-release="$name-$ver"
2444-releasedir="/tmp/$release"
2445-tag="release-$ver"
2446-branch="build-$ver"
2447-curbranch=`git branch | grep "*" | sed "s/* //"`
2448-timestamp=$(date)
2449-tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
2450-remote="github"
2451-
2452-git branch "$branch"
2453-git checkout "$branch"
2454-
2455-echo "Tokenizing..."
2456-
2457-find . -name "$js" | xargs sed -i -e "$tokens"
2458-find . -name "$css" | xargs sed -i -e "$tokens"
2459-
2460-git add "$js"
2461-git add "$css"
2462-
2463-echo "Minifying..."
2464-
2465-echo "/*" > "$mini"
2466-cat LICENSE | sed "$tokens" >> "$mini"
2467-echo "*/" >> "$mini"
2468-
2469-curl -s \
2470- -d compilation_level=SIMPLE_OPTIMIZATIONS \
2471- -d output_format=text \
2472- -d output_info=compiled_code \
2473- --data-urlencode "js_code@$js" \
2474- http://closure-compiler.appspot.com/compile \
2475- >> "$mini"
2476-
2477-git add "$mini"
2478-
2479-git commit -m "release $ver"
2480-
2481-echo "Tagging..."
2482-
2483-git tag -a "$tag" -m "tagged version $ver"
2484-git push "$remote" --tags
2485-
2486-echo "Archiving..."
2487-
2488-rm -rf "$releasedir"
2489-mkdir "$releasedir"
2490-
2491-cp $name.* "$releasedir"
2492-cp spinner.gif "$releasedir"
2493-cp README.* "$releasedir"
2494-
2495-zip -r "$releasedir.zip" "$releasedir"
2496-rm -rf "$releasedir"
2497-
2498-echo "Cleaning Up..."
2499-
2500-git checkout "$curbranch"
2501-git branch -D "$branch"
2502-
2503-echo "Done. Release archive created: $releasedir.zip"
2504
2505=== removed file 'base_import/static/lib/select2/select2.css'
2506--- base_import/static/lib/select2/select2.css 2013-10-27 12:31:04 +0000
2507+++ base_import/static/lib/select2/select2.css 1970-01-01 00:00:00 +0000
2508@@ -1,524 +0,0 @@
2509-/*
2510-Version: @@ver@@ Timestamp: @@timestamp@@
2511-*/
2512-.select2-container {
2513- position: relative;
2514- display: inline-block;
2515- /* inline-block for ie7 */
2516- zoom: 1;
2517- *display: inline;
2518- vertical-align: top;
2519-}
2520-
2521-.select2-container,
2522-.select2-drop,
2523-.select2-search,
2524-.select2-search input{
2525- /*
2526- Force border-box so that % widths fit the parent
2527- container without overlap because of margin/padding.
2528-
2529- More Info : http://www.quirksmode.org/css/box.html
2530- */
2531- -moz-box-sizing: border-box; /* firefox */
2532- -ms-box-sizing: border-box; /* ie */
2533- -webkit-box-sizing: border-box; /* webkit */
2534- -khtml-box-sizing: border-box; /* konqueror */
2535- box-sizing: border-box; /* css3 */
2536-}
2537-
2538-.select2-container .select2-choice {
2539- background-color: #fff;
2540- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
2541- background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
2542- background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
2543- background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%);
2544- background-image: -ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%);
2545- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#ffffff', GradientType = 0);
2546- background-image: linear-gradient(top, #eeeeee 0%, #ffffff 50%);
2547- -webkit-border-radius: 4px;
2548- -moz-border-radius: 4px;
2549- border-radius: 4px;
2550- -moz-background-clip: padding;
2551- -webkit-background-clip: padding-box;
2552- background-clip: padding-box;
2553- border: 1px solid #aaa;
2554- display: block;
2555- overflow: hidden;
2556- white-space: nowrap;
2557- position: relative;
2558- height: 26px;
2559- line-height: 26px;
2560- padding: 0 0 0 8px;
2561- color: #444;
2562- text-decoration: none;
2563-}
2564-
2565-.select2-container.select2-drop-above .select2-choice
2566-{
2567- border-bottom-color: #aaa;
2568- -webkit-border-radius:0px 0px 4px 4px;
2569- -moz-border-radius:0px 0px 4px 4px;
2570- border-radius:0px 0px 4px 4px;
2571- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white));
2572- background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%);
2573- background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%);
2574- background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%);
2575- background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 90%);
2576- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
2577- background-image: linear-gradient(top, #eeeeee 0%,#ffffff 90%);
2578-}
2579-
2580-.select2-container .select2-choice span {
2581- margin-right: 26px;
2582- display: block;
2583- overflow: hidden;
2584- white-space: nowrap;
2585- -o-text-overflow: ellipsis;
2586- -ms-text-overflow: ellipsis;
2587- text-overflow: ellipsis;
2588-}
2589-
2590-.select2-container .select2-choice abbr {
2591- display: block;
2592- position: absolute;
2593- right: 26px;
2594- top: 8px;
2595- width: 12px;
2596- height: 12px;
2597- font-size: 1px;
2598- background: url('select2.png') right top no-repeat;
2599- cursor: pointer;
2600- text-decoration: none;
2601- border:0;
2602- outline: 0;
2603-}
2604-.select2-container .select2-choice abbr:hover {
2605- background-position: right -11px;
2606- cursor: pointer;
2607-}
2608-
2609-.select2-drop {
2610- background: #fff;
2611- color: #000;
2612- border: 1px solid #aaa;
2613- border-top: 0;
2614- position: absolute;
2615- top: 100%;
2616- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
2617- -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
2618- -o-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
2619- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
2620- z-index: 9999;
2621- width:100%;
2622- margin-top:-1px;
2623-
2624- -webkit-border-radius: 0 0 4px 4px;
2625- -moz-border-radius: 0 0 4px 4px;
2626- border-radius: 0 0 4px 4px;
2627-}
2628-
2629-.select2-drop.select2-drop-above {
2630- -webkit-border-radius: 4px 4px 0px 0px;
2631- -moz-border-radius: 4px 4px 0px 0px;
2632- border-radius: 4px 4px 0px 0px;
2633- margin-top:1px;
2634- border-top: 1px solid #aaa;
2635- border-bottom: 0;
2636-
2637- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
2638- -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
2639- -o-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
2640- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
2641-}
2642-
2643-.select2-container .select2-choice div {
2644- -webkit-border-radius: 0 4px 4px 0;
2645- -moz-border-radius: 0 4px 4px 0;
2646- border-radius: 0 4px 4px 0;
2647- -moz-background-clip: padding;
2648- -webkit-background-clip: padding-box;
2649- background-clip: padding-box;
2650- background: #ccc;
2651- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
2652- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
2653- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
2654- background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
2655- background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%);
2656- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#cccccc', endColorstr = '#eeeeee', GradientType = 0);
2657- background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%);
2658- border-left: 1px solid #aaa;
2659- position: absolute;
2660- right: 0;
2661- top: 0;
2662- display: block;
2663- height: 100%;
2664- width: 18px;
2665-}
2666-
2667-.select2-container .select2-choice div b {
2668- background: url('select2.png') no-repeat 0 1px;
2669- display: block;
2670- width: 100%;
2671- height: 100%;
2672-}
2673-
2674-.select2-search {
2675- display: inline-block;
2676- white-space: nowrap;
2677- z-index: 10000;
2678- min-height: 26px;
2679- width: 100%;
2680- margin: 0;
2681- padding-left: 4px;
2682- padding-right: 4px;
2683-}
2684-
2685-.select2-search-hidden {
2686- display: block;
2687- position: absolute;
2688- left: -10000px;
2689-}
2690-
2691-.select2-search input {
2692- background: #fff url('select2.png') no-repeat 100% -22px;
2693- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
2694- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
2695- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
2696- background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
2697- background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
2698- background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
2699- padding: 4px 20px 4px 5px;
2700- outline: 0;
2701- border: 1px solid #aaa;
2702- font-family: sans-serif;
2703- font-size: 1em;
2704- width:100%;
2705- margin:0;
2706- height:auto !important;
2707- min-height: 26px;
2708- -webkit-box-shadow: none;
2709- -moz-box-shadow: none;
2710- box-shadow: none;
2711- border-radius: 0;
2712- -moz-border-radius: 0;
2713- -webkit-border-radius: 0;
2714-}
2715-
2716-.select2-drop.select2-drop-above .select2-search input
2717-{
2718- margin-top:4px;
2719-}
2720-
2721-.select2-search input.select2-active {
2722- background: #fff url('spinner.gif') no-repeat 100%;
2723- background: url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
2724- background: url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
2725- background: url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
2726- background: url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
2727- background: url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
2728- background: url('spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
2729-}
2730-
2731-
2732-.select2-container-active .select2-choice,
2733-.select2-container-active .select2-choices {
2734- -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
2735- -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
2736- -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
2737- box-shadow : 0 0 5px rgba(0,0,0,.3);
2738- border: 1px solid #5897fb;
2739- outline: none;
2740-}
2741-
2742-.select2-dropdown-open .select2-choice {
2743- border: 1px solid #aaa;
2744- border-bottom-color: transparent;
2745- -webkit-box-shadow: 0 1px 0 #fff inset;
2746- -moz-box-shadow : 0 1px 0 #fff inset;
2747- -o-box-shadow : 0 1px 0 #fff inset;
2748- box-shadow : 0 1px 0 #fff inset;
2749- background-color: #eee;
2750- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
2751- background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
2752- background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
2753- background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
2754- background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
2755- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
2756- background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
2757- -webkit-border-bottom-left-radius : 0;
2758- -webkit-border-bottom-right-radius: 0;
2759- -moz-border-radius-bottomleft : 0;
2760- -moz-border-radius-bottomright: 0;
2761- border-bottom-left-radius : 0;
2762- border-bottom-right-radius: 0;
2763-}
2764-
2765-.select2-dropdown-open .select2-choice div {
2766- background: transparent;
2767- border-left: none;
2768-}
2769-.select2-dropdown-open .select2-choice div b {
2770- background-position: -18px 1px;
2771-}
2772-
2773-/* results */
2774-.select2-results {
2775- margin: 4px 4px 4px 0;
2776- padding: 0 0 0 4px;
2777- position: relative;
2778- overflow-x: hidden;
2779- overflow-y: auto;
2780- max-height: 200px;
2781-}
2782-
2783-.select2-results ul.select2-result-sub {
2784- margin: 0 0 0 0;
2785-}
2786-
2787-.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px }
2788-.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px }
2789-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px }
2790-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px }
2791-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px }
2792-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px }
2793-.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px }
2794-
2795-.select2-results li {
2796- list-style: none;
2797- display: list-item;
2798-}
2799-
2800-.select2-results li.select2-result-with-children > .select2-result-label {
2801- font-weight: bold;
2802-}
2803-
2804-.select2-results .select2-result-label {
2805- padding: 3px 7px 4px;
2806- margin: 0;
2807- cursor: pointer;
2808-}
2809-
2810-.select2-results .select2-highlighted {
2811- background: #3875d7;
2812- color: #fff;
2813-}
2814-.select2-results li em {
2815- background: #feffde;
2816- font-style: normal;
2817-}
2818-.select2-results .select2-highlighted em {
2819- background: transparent;
2820-}
2821-.select2-results .select2-no-results,
2822-.select2-results .select2-searching,
2823-.select2-results .select2-selection-limit {
2824- background: #f4f4f4;
2825- display: list-item;
2826-}
2827-
2828-/*
2829-disabled look for already selected choices in the results dropdown
2830-.select2-results .select2-disabled.select2-highlighted {
2831- color: #666;
2832- background: #f4f4f4;
2833- display: list-item;
2834- cursor: default;
2835-}
2836-.select2-results .select2-disabled {
2837- background: #f4f4f4;
2838- display: list-item;
2839- cursor: default;
2840-}
2841-*/
2842-.select2-results .select2-disabled {
2843- display: none;
2844-}
2845-
2846-.select2-more-results.select2-active {
2847- background: #f4f4f4 url('spinner.gif') no-repeat 100%;
2848-}
2849-
2850-.select2-more-results {
2851- background: #f4f4f4;
2852- display: list-item;
2853-}
2854-
2855-/* disabled styles */
2856-
2857-.select2-container.select2-container-disabled .select2-choice {
2858- background-color: #f4f4f4;
2859- background-image: none;
2860- border: 1px solid #ddd;
2861- cursor: default;
2862-}
2863-
2864-.select2-container.select2-container-disabled .select2-choice div {
2865- background-color: #f4f4f4;
2866- background-image: none;
2867- border-left: 0;
2868-}
2869-
2870-
2871-/* multiselect */
2872-
2873-.select2-container-multi .select2-choices {
2874- background-color: #fff;
2875- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
2876- background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
2877- background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
2878- background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
2879- background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
2880- background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%);
2881- border: 1px solid #aaa;
2882- margin: 0;
2883- padding: 0;
2884- cursor: text;
2885- overflow: hidden;
2886- height: auto !important;
2887- height: 1%;
2888- position: relative;
2889-}
2890-
2891-.select2-container-multi .select2-choices {
2892- min-height: 26px;
2893-}
2894-
2895-.select2-container-multi.select2-container-active .select2-choices {
2896- -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
2897- -moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
2898- -o-box-shadow : 0 0 5px rgba(0,0,0,.3);
2899- box-shadow : 0 0 5px rgba(0,0,0,.3);
2900- border: 1px solid #5897fb;
2901- outline: none;
2902-}
2903-.select2-container-multi .select2-choices li {
2904- float: left;
2905- list-style: none;
2906-}
2907-.select2-container-multi .select2-choices .select2-search-field {
2908- white-space: nowrap;
2909- margin: 0;
2910- padding: 0;
2911-}
2912-
2913-.select2-container-multi .select2-choices .select2-search-field input {
2914- color: #666;
2915- background: transparent !important;
2916- font-family: sans-serif;
2917- font-size: 100%;
2918- height: 15px;
2919- padding: 5px;
2920- margin: 1px 0;
2921- outline: 0;
2922- border: 0;
2923- -webkit-box-shadow: none;
2924- -moz-box-shadow : none;
2925- -o-box-shadow : none;
2926- box-shadow : none;
2927-}
2928-
2929-.select2-container-multi .select2-choices .select2-search-field input.select2-active {
2930- background: #fff url('spinner.gif') no-repeat 100% !important;
2931-}
2932-
2933-.select2-default {
2934- color: #999 !important;
2935-}
2936-
2937-.select2-container-multi .select2-choices .select2-search-choice {
2938- -webkit-border-radius: 3px;
2939- -moz-border-radius : 3px;
2940- border-radius : 3px;
2941- -moz-background-clip : padding;
2942- -webkit-background-clip: padding-box;
2943- background-clip : padding-box;
2944- background-color: #e4e4e4;
2945- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
2946- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
2947- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
2948- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
2949- background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
2950- background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
2951- background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
2952- -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
2953- -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
2954- box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
2955- color: #333;
2956- border: 1px solid #aaaaaa;
2957- line-height: 13px;
2958- padding: 3px 5px 3px 18px;
2959- margin: 3px 0 3px 5px;
2960- position: relative;
2961- cursor: default;
2962-}
2963-.select2-container-multi .select2-choices .select2-search-choice span {
2964- cursor: default;
2965-}
2966-.select2-container-multi .select2-choices .select2-search-choice-focus {
2967- background: #d4d4d4;
2968-}
2969-
2970-.select2-search-choice-close {
2971- display: block;
2972- position: absolute;
2973- right: 3px;
2974- top: 4px;
2975- width: 12px;
2976- height: 13px;
2977- font-size: 1px;
2978- background: url('select2.png') right top no-repeat;
2979- outline: none;
2980-}
2981-
2982-.select2-container-multi .select2-search-choice-close {
2983- left: 3px;
2984-}
2985-
2986-
2987-.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
2988- background-position: right -11px;
2989-}
2990-.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
2991- background-position: right -11px;
2992-}
2993-
2994-/* disabled styles */
2995-
2996-.select2-container-multi.select2-container-disabled .select2-choices{
2997- background-color: #f4f4f4;
2998- background-image: none;
2999- border: 1px solid #ddd;
3000- cursor: default;
3001-}
3002-
3003-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
3004- background-image: none;
3005- background-color: #f4f4f4;
3006- border: 1px solid #ddd;
3007- padding: 3px 5px 3px 5px;
3008-}
3009-
3010-.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close {
3011- display: none;
3012-}
3013-/* end multiselect */
3014-
3015-.select2-result-selectable .select2-match,
3016-.select2-result-unselectable .select2-result-selectable .select2-match { text-decoration: underline; }
3017-.select2-result-unselectable .select2-match { text-decoration: none; }
3018-
3019-.select2-offscreen { position: absolute; left: -10000px; }
3020-
3021-/* Retina-ize icons */
3022-
3023-@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
3024- .select2-search input, .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice div b {
3025- background-image: url(select2x2.png) !important;
3026- background-repeat: no-repeat !important;
3027- background-size: 60px 40px !important;
3028- }
3029- .select2-search input {
3030- background-position: 100% -21px !important;
3031- }
3032-}
3033\ No newline at end of file
3034
3035=== removed file 'base_import/static/lib/select2/select2.js'
3036--- base_import/static/lib/select2/select2.js 2013-10-27 12:31:04 +0000
3037+++ base_import/static/lib/select2/select2.js 1970-01-01 00:00:00 +0000
3038@@ -1,2407 +0,0 @@
3039-/*
3040- Copyright 2012 Igor Vaynberg
3041-
3042- Version: @@ver@@ Timestamp: @@timestamp@@
3043-
3044- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
3045- compliance with the License. You may obtain a copy of the License in the LICENSE file, or at:
3046-
3047- http://www.apache.org/licenses/LICENSE-2.0
3048-
3049- Unless required by applicable law or agreed to in writing, software distributed under the License is
3050- distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3051- See the License for the specific language governing permissions and limitations under the License.
3052- */
3053- (function ($) {
3054- if(typeof $.fn.each2 == "undefined"){
3055- $.fn.extend({
3056- /*
3057- * 4-10 times faster .each replacement
3058- * use it carefully, as it overrides jQuery context of element on each iteration
3059- */
3060- each2 : function (c) {
3061- var j = $([0]), i = -1, l = this.length;
3062- while (
3063- ++i < l
3064- && (j.context = j[0] = this[i])
3065- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
3066- );
3067- return this;
3068- }
3069- });
3070- }
3071-})(jQuery);
3072-
3073-(function ($, undefined) {
3074- "use strict";
3075- /*global document, window, jQuery, console */
3076-
3077- if (window.Select2 !== undefined) {
3078- return;
3079- }
3080-
3081- var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer;
3082-
3083- KEY = {
3084- TAB: 9,
3085- ENTER: 13,
3086- ESC: 27,
3087- SPACE: 32,
3088- LEFT: 37,
3089- UP: 38,
3090- RIGHT: 39,
3091- DOWN: 40,
3092- SHIFT: 16,
3093- CTRL: 17,
3094- ALT: 18,
3095- PAGE_UP: 33,
3096- PAGE_DOWN: 34,
3097- HOME: 36,
3098- END: 35,
3099- BACKSPACE: 8,
3100- DELETE: 46,
3101- isArrow: function (k) {
3102- k = k.which ? k.which : k;
3103- switch (k) {
3104- case KEY.LEFT:
3105- case KEY.RIGHT:
3106- case KEY.UP:
3107- case KEY.DOWN:
3108- return true;
3109- }
3110- return false;
3111- },
3112- isControl: function (e) {
3113- var k = e.which;
3114- switch (k) {
3115- case KEY.SHIFT:
3116- case KEY.CTRL:
3117- case KEY.ALT:
3118- return true;
3119- }
3120-
3121- if (e.metaKey) return true;
3122-
3123- return false;
3124- },
3125- isFunctionKey: function (k) {
3126- k = k.which ? k.which : k;
3127- return k >= 112 && k <= 123;
3128- }
3129- };
3130-
3131- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
3132-
3133- function indexOf(value, array) {
3134- var i = 0, l = array.length, v;
3135-
3136- if (typeof value === "undefined") {
3137- return -1;
3138- }
3139-
3140- if (value.constructor === String) {
3141- for (; i < l; i = i + 1) if (value.localeCompare(array[i]) === 0) return i;
3142- } else {
3143- for (; i < l; i = i + 1) {
3144- v = array[i];
3145- if (v.constructor === String) {
3146- if (v.localeCompare(value) === 0) return i;
3147- } else {
3148- if (v === value) return i;
3149- }
3150- }
3151- }
3152- return -1;
3153- }
3154-
3155- /**
3156- * Compares equality of a and b taking into account that a and b may be strings, in which case localeCompare is used
3157- * @param a
3158- * @param b
3159- */
3160- function equal(a, b) {
3161- if (a === b) return true;
3162- if (a === undefined || b === undefined) return false;
3163- if (a === null || b === null) return false;
3164- if (a.constructor === String) return a.localeCompare(b) === 0;
3165- if (b.constructor === String) return b.localeCompare(a) === 0;
3166- return false;
3167- }
3168-
3169- /**
3170- * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty
3171- * strings
3172- * @param string
3173- * @param separator
3174- */
3175- function splitVal(string, separator) {
3176- var val, i, l;
3177- if (string === null || string.length < 1) return [];
3178- val = string.split(separator);
3179- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
3180- return val;
3181- }
3182-
3183- function getSideBorderPadding(element) {
3184- return element.outerWidth() - element.width();
3185- }
3186-
3187- function installKeyUpChangeEvent(element) {
3188- var key="keyup-change-value";
3189- element.bind("keydown", function () {
3190- if ($.data(element, key) === undefined) {
3191- $.data(element, key, element.val());
3192- }
3193- });
3194- element.bind("keyup", function () {
3195- var val= $.data(element, key);
3196- if (val !== undefined && element.val() !== val) {
3197- $.removeData(element, key);
3198- element.trigger("keyup-change");
3199- }
3200- });
3201- }
3202-
3203- $(document).delegate("*", "mousemove", function (e) {
3204- $.data(document, "select2-lastpos", {x: e.pageX, y: e.pageY});
3205- });
3206-
3207- /**
3208- * filters mouse events so an event is fired only if the mouse moved.
3209- *
3210- * filters out mouse events that occur when mouse is stationary but
3211- * the elements under the pointer are scrolled.
3212- */
3213- function installFilteredMouseMove(element) {
3214- element.bind("mousemove", function (e) {
3215- var lastpos = $.data(document, "select2-lastpos");
3216- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
3217- $(e.target).trigger("mousemove-filtered", e);
3218- }
3219- });
3220- }
3221-
3222- /**
3223- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
3224- * within the last quietMillis milliseconds.
3225- *
3226- * @param quietMillis number of milliseconds to wait before invoking fn
3227- * @param fn function to be debounced
3228- * @param ctx object to be used as this reference within fn
3229- * @return debounced version of fn
3230- */
3231- function debounce(quietMillis, fn, ctx) {
3232- ctx = ctx || undefined;
3233- var timeout;
3234- return function () {
3235- var args = arguments;
3236- window.clearTimeout(timeout);
3237- timeout = window.setTimeout(function() {
3238- fn.apply(ctx, args);
3239- }, quietMillis);
3240- };
3241- }
3242-
3243- /**
3244- * A simple implementation of a thunk
3245- * @param formula function used to lazily initialize the thunk
3246- * @return {Function}
3247- */
3248- function thunk(formula) {
3249- var evaluated = false,
3250- value;
3251- return function() {
3252- if (evaluated === false) { value = formula(); evaluated = true; }
3253- return value;
3254- };
3255- };
3256-
3257- function installDebouncedScroll(threshold, element) {
3258- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
3259- element.bind("scroll", function (e) {
3260- if (indexOf(e.target, element.get()) >= 0) notify(e);
3261- });
3262- }
3263-
3264- function killEvent(event) {
3265- event.preventDefault();
3266- event.stopPropagation();
3267- }
3268-
3269- function measureTextWidth(e) {
3270- if (!sizer){
3271- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
3272- sizer = $("<div></div>").css({
3273- position: "absolute",
3274- left: "-10000px",
3275- top: "-10000px",
3276- display: "none",
3277- fontSize: style.fontSize,
3278- fontFamily: style.fontFamily,
3279- fontStyle: style.fontStyle,
3280- fontWeight: style.fontWeight,
3281- letterSpacing: style.letterSpacing,
3282- textTransform: style.textTransform,
3283- whiteSpace: "nowrap"
3284- });
3285- $("body").append(sizer);
3286- }
3287- sizer.text(e.val());
3288- return sizer.width();
3289- }
3290-
3291- function markMatch(text, term, markup) {
3292- var match=text.toUpperCase().indexOf(term.toUpperCase()),
3293- tl=term.length;
3294-
3295- if (match<0) {
3296- markup.push(text);
3297- return;
3298- }
3299-
3300- markup.push(text.substring(0, match));
3301- markup.push("<span class='select2-match'>");
3302- markup.push(text.substring(match, match + tl));
3303- markup.push("</span>");
3304- markup.push(text.substring(match + tl, text.length));
3305- }
3306-
3307- /**
3308- * Produces an ajax-based query function
3309- *
3310- * @param options object containing configuration paramters
3311- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
3312- * @param options.url url for the data
3313- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
3314- * @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
3315- * @param options.traditional a boolean flag that should be true if you wish to use the traditional style of param serialization for the ajax request
3316- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
3317- * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
3318- * The expected format is an object containing the following keys:
3319- * results array of objects that will be used as choices
3320- * more (optional) boolean indicating whether there are more results available
3321- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
3322- */
3323- function ajax(options) {
3324- var timeout, // current scheduled but not yet executed request
3325- requestSequence = 0, // sequence used to drop out-of-order responses
3326- handler = null,
3327- quietMillis = options.quietMillis || 100;
3328-
3329- return function (query) {
3330- window.clearTimeout(timeout);
3331- timeout = window.setTimeout(function () {
3332- requestSequence += 1; // increment the sequence
3333- var requestNumber = requestSequence, // this request's sequence number
3334- data = options.data, // ajax data function
3335- transport = options.transport || $.ajax,
3336- traditional = options.traditional || false,
3337- type = options.type || 'GET'; // set type of request (GET or POST)
3338-
3339- data = data.call(this, query.term, query.page, query.context);
3340-
3341- if( null !== handler) { handler.abort(); }
3342-
3343- handler = transport.call(null, {
3344- url: options.url,
3345- dataType: options.dataType,
3346- data: data,
3347- type: type,
3348- traditional: traditional,
3349- success: function (data) {
3350- if (requestNumber < requestSequence) {
3351- return;
3352- }
3353- // TODO 3.0 - replace query.page with query so users have access to term, page, etc.
3354- var results = options.results(data, query.page);
3355- query.callback(results);
3356- }
3357- });
3358- }, quietMillis);
3359- };
3360- }
3361-
3362- /**
3363- * Produces a query function that works with a local array
3364- *
3365- * @param options object containing configuration parameters. The options parameter can either be an array or an
3366- * object.
3367- *
3368- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
3369- *
3370- * If the object form is used ti is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
3371- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
3372- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
3373- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
3374- * the text.
3375- */
3376- function local(options) {
3377- var data = options, // data elements
3378- dataText,
3379- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
3380-
3381- if (!$.isArray(data)) {
3382- text = data.text;
3383- // if text is not a function we assume it to be a key name
3384- if (!$.isFunction(text)) {
3385- dataText = data.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
3386- text = function (item) { return item[dataText]; };
3387- }
3388- data = data.results;
3389- }
3390-
3391- return function (query) {
3392- var t = query.term, filtered = { results: [] }, process;
3393- if (t === "") {
3394- query.callback({results: data});
3395- return;
3396- }
3397-
3398- process = function(datum, collection) {
3399- var group, attr;
3400- datum = datum[0];
3401- if (datum.children) {
3402- group = {};
3403- for (attr in datum) {
3404- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
3405- }
3406- group.children=[];
3407- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
3408- if (group.children.length) {
3409- collection.push(group);
3410- }
3411- } else {
3412- if (query.matcher(t, text(datum))) {
3413- collection.push(datum);
3414- }
3415- }
3416- };
3417-
3418- $(data).each2(function(i, datum) { process(datum, filtered.results); });
3419- query.callback(filtered);
3420- };
3421- }
3422-
3423- // TODO javadoc
3424- function tags(data) {
3425- // TODO even for a function we should probably return a wrapper that does the same object/string check as
3426- // the function for arrays. otherwise only functions that return objects are supported.
3427- if ($.isFunction(data)) {
3428- return data;
3429- }
3430-
3431- // if not a function we assume it to be an array
3432-
3433- return function (query) {
3434- var t = query.term, filtered = {results: []};
3435- $(data).each(function () {
3436- var isObject = this.text !== undefined,
3437- text = isObject ? this.text : this;
3438- if (t === "" || query.matcher(t, text)) {
3439- filtered.results.push(isObject ? this : {id: this, text: this});
3440- }
3441- });
3442- query.callback(filtered);
3443- };
3444- }
3445-
3446- /**
3447- * Checks if the formatter function should be used.
3448- *
3449- * Throws an error if it is not a function. Returns true if it should be used,
3450- * false if no formatting should be performed.
3451- *
3452- * @param formatter
3453- */
3454- function checkFormatter(formatter, formatterName) {
3455- if ($.isFunction(formatter)) return true;
3456- if (!formatter) return false;
3457- throw new Error("formatterName must be a function or a falsy value");
3458- }
3459-
3460- function evaluate(val) {
3461- return $.isFunction(val) ? val() : val;
3462- }
3463-
3464- function countResults(results) {
3465- var count = 0;
3466- $.each(results, function(i, item) {
3467- if (item.children) {
3468- count += countResults(item.children);
3469- } else {
3470- count++;
3471- }
3472- });
3473- return count;
3474- }
3475-
3476- /**
3477- * Default tokenizer. This function uses breaks the input on substring match of any string from the
3478- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
3479- * two options have to be defined in order for the tokenizer to work.
3480- *
3481- * @param input text user has typed so far or pasted into the search field
3482- * @param selection currently selected choices
3483- * @param selectCallback function(choice) callback tho add the choice to selection
3484- * @param opts select2's opts
3485- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
3486- */
3487- function defaultTokenizer(input, selection, selectCallback, opts) {
3488- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
3489- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
3490- token, // token
3491- index, // position at which the separator was found
3492- i, l, // looping variables
3493- separator; // the matched separator
3494-
3495- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
3496-
3497- while (true) {
3498- index = -1;
3499-
3500- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
3501- separator = opts.tokenSeparators[i];
3502- index = input.indexOf(separator);
3503- if (index >= 0) break;
3504- }
3505-
3506- if (index < 0) break; // did not find any token separator in the input string, bail
3507-
3508- token = input.substring(0, index);
3509- input = input.substring(index + separator.length);
3510-
3511- if (token.length > 0) {
3512- token = opts.createSearchChoice(token, selection);
3513- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
3514- dupe = false;
3515- for (i = 0, l = selection.length; i < l; i++) {
3516- if (equal(opts.id(token), opts.id(selection[i]))) {
3517- dupe = true; break;
3518- }
3519- }
3520-
3521- if (!dupe) selectCallback(token);
3522- }
3523- }
3524- }
3525-
3526- if (original.localeCompare(input) != 0) return input;
3527- }
3528-
3529- /**
3530- * blurs any Select2 container that has focus when an element outside them was clicked or received focus
3531- *
3532- * also takes care of clicks on label tags that point to the source element
3533- */
3534- $(document).ready(function () {
3535- $(document).delegate("*", "mousedown touchend", function (e) {
3536- var target = $(e.target).closest("div.select2-container").get(0), attr;
3537- if (target) {
3538- $(document).find("div.select2-container-active").each(function () {
3539- if (this !== target) $(this).data("select2").blur();
3540- });
3541- } else {
3542- target = $(e.target).closest("div.select2-drop").get(0);
3543- $(document).find("div.select2-drop-active").each(function () {
3544- if (this !== target) $(this).data("select2").blur();
3545- });
3546- }
3547-
3548- target=$(e.target);
3549- attr = target.attr("for");
3550- if ("LABEL" === e.target.tagName && attr && attr.length > 0) {
3551- target = $("#"+attr);
3552- target = target.data("select2");
3553- if (target !== undefined) { target.focus(); e.preventDefault();}
3554- }
3555- });
3556- });
3557-
3558- /**
3559- * Creates a new class
3560- *
3561- * @param superClass
3562- * @param methods
3563- */
3564- function clazz(SuperClass, methods) {
3565- var constructor = function () {};
3566- constructor.prototype = new SuperClass;
3567- constructor.prototype.constructor = constructor;
3568- constructor.prototype.parent = SuperClass.prototype;
3569- constructor.prototype = $.extend(constructor.prototype, methods);
3570- return constructor;
3571- }
3572-
3573- AbstractSelect2 = clazz(Object, {
3574-
3575- // abstract
3576- bind: function (func) {
3577- var self = this;
3578- return function () {
3579- func.apply(self, arguments);
3580- };
3581- },
3582-
3583- // abstract
3584- init: function (opts) {
3585- var results, search, resultsSelector = ".select2-results";
3586-
3587- // prepare options
3588- this.opts = opts = this.prepareOpts(opts);
3589-
3590- this.id=opts.id;
3591-
3592- // destroy if called on an existing component
3593- if (opts.element.data("select2") !== undefined &&
3594- opts.element.data("select2") !== null) {
3595- this.destroy();
3596- }
3597-
3598- this.enabled=true;
3599- this.container = this.createContainer();
3600-
3601- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
3602- this.containerSelector="#"+this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
3603- this.container.attr("id", this.containerId);
3604-
3605- // cache the body so future lookups are cheap
3606- this.body = thunk(function() { return opts.element.closest("body"); });
3607-
3608- if (opts.element.attr("class") !== undefined) {
3609- this.container.addClass(opts.element.attr("class").replace(/validate\[[\S ]+] ?/, ''));
3610- }
3611-
3612- this.container.css(evaluate(opts.containerCss));
3613- this.container.addClass(evaluate(opts.containerCssClass));
3614-
3615- // swap container for the element
3616- this.opts.element
3617- .data("select2", this)
3618- .hide()
3619- .before(this.container);
3620- this.container.data("select2", this);
3621-
3622- this.dropdown = this.container.find(".select2-drop");
3623- this.dropdown.addClass(evaluate(opts.dropdownCssClass));
3624- this.dropdown.data("select2", this);
3625-
3626- this.results = results = this.container.find(resultsSelector);
3627- this.search = search = this.container.find("input.select2-input");
3628-
3629- search.attr("tabIndex", this.opts.element.attr("tabIndex"));
3630-
3631- this.resultsPage = 0;
3632- this.context = null;
3633-
3634- // initialize the container
3635- this.initContainer();
3636- this.initContainerWidth();
3637-
3638- installFilteredMouseMove(this.results);
3639- this.dropdown.delegate(resultsSelector, "mousemove-filtered", this.bind(this.highlightUnderEvent));
3640-
3641- installDebouncedScroll(80, this.results);
3642- this.dropdown.delegate(resultsSelector, "scroll-debounced", this.bind(this.loadMoreIfNeeded));
3643-
3644- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
3645- if ($.fn.mousewheel) {
3646- results.mousewheel(function (e, delta, deltaX, deltaY) {
3647- var top = results.scrollTop(), height;
3648- if (deltaY > 0 && top - deltaY <= 0) {
3649- results.scrollTop(0);
3650- killEvent(e);
3651- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
3652- results.scrollTop(results.get(0).scrollHeight - results.height());
3653- killEvent(e);
3654- }
3655- });
3656- }
3657-
3658- installKeyUpChangeEvent(search);
3659- search.bind("keyup-change", this.bind(this.updateResults));
3660- search.bind("focus", function () { search.addClass("select2-focused"); if (search.val() === " ") search.val(""); });
3661- search.bind("blur", function () { search.removeClass("select2-focused");});
3662-
3663- this.dropdown.delegate(resultsSelector, "mouseup", this.bind(function (e) {
3664- if ($(e.target).closest(".select2-result-selectable:not(.select2-disabled)").length > 0) {
3665- this.highlightUnderEvent(e);
3666- this.selectHighlighted(e);
3667- } else {
3668- this.focusSearch();
3669- }
3670- killEvent(e);
3671- }));
3672-
3673- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
3674- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
3675- // dom it will trigger the popup close, which is not what we want
3676- this.dropdown.bind("click mouseup mousedown", function (e) { e.stopPropagation(); });
3677-
3678- if ($.isFunction(this.opts.initSelection)) {
3679- // initialize selection based on the current value of the source element
3680- this.initSelection();
3681-
3682- // if the user has provided a function that can set selection based on the value of the source element
3683- // we monitor the change event on the element and trigger it, allowing for two way synchronization
3684- this.monitorSource();
3685- }
3686-
3687- if (opts.element.is(":disabled") || opts.element.is("[readonly='readonly']")) this.disable();
3688- },
3689-
3690- // abstract
3691- destroy: function () {
3692- var select2 = this.opts.element.data("select2");
3693- if (select2 !== undefined) {
3694- select2.container.remove();
3695- select2.dropdown.remove();
3696- select2.opts.element
3697- .removeData("select2")
3698- .unbind(".select2")
3699- .show();
3700- }
3701- },
3702-
3703- // abstract
3704- prepareOpts: function (opts) {
3705- var element, select, idKey, ajaxUrl;
3706-
3707- element = opts.element;
3708-
3709- if (element.get(0).tagName.toLowerCase() === "select") {
3710- this.select = select = opts.element;
3711- }
3712-
3713- if (select) {
3714- // these options are not allowed when attached to a select because they are picked up off the element itself
3715- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
3716- if (this in opts) {
3717- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
3718- }
3719- });
3720- }
3721-
3722- opts = $.extend({}, {
3723- populateResults: function(container, results, query) {
3724- var populate, data, result, children, id=this.opts.id, self=this;
3725-
3726- populate=function(results, container, depth) {
3727-
3728- var i, l, result, selectable, compound, node, label, innerContainer, formatted;
3729- for (i = 0, l = results.length; i < l; i = i + 1) {
3730-
3731- result=results[i];
3732- selectable=id(result) !== undefined;
3733- compound=("children" in result) && result.children.length > 0;
3734-
3735- node=$("<li></li>");
3736- node.addClass("select2-results-dept-"+depth);
3737- node.addClass("select2-result");
3738- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
3739- if (compound) { node.addClass("select2-result-with-children"); }
3740- node.addClass(self.opts.formatResultCssClass(result));
3741-
3742- label=$("<div></div>");
3743- label.addClass("select2-result-label");
3744-
3745- formatted=opts.formatResult(result, label, query);
3746- if (formatted!==undefined) {
3747- label.html(self.opts.escapeMarkup(formatted));
3748- }
3749-
3750- node.append(label);
3751-
3752- if (compound) {
3753-
3754- innerContainer=$("<ul></ul>");
3755- innerContainer.addClass("select2-result-sub");
3756- populate(result.children, innerContainer, depth+1);
3757- node.append(innerContainer);
3758- }
3759-
3760- node.data("select2-data", result);
3761- container.append(node);
3762- }
3763- };
3764-
3765- populate(results, container, 0);
3766- }
3767- }, $.fn.select2.defaults, opts);
3768-
3769- if (typeof(opts.id) !== "function") {
3770- idKey = opts.id;
3771- opts.id = function (e) { return e[idKey]; };
3772- }
3773-
3774- if (select) {
3775- opts.query = this.bind(function (query) {
3776- var data = { results: [], more: false },
3777- term = query.term,
3778- children, firstChild, process;
3779-
3780- process=function(element, collection) {
3781- var group;
3782- if (element.is("option")) {
3783- if (query.matcher(term, element.text(), element)) {
3784- collection.push({id:element.attr("value"), text:element.text(), element: element.get(), css: element.attr("class")});
3785- }
3786- } else if (element.is("optgroup")) {
3787- group={text:element.attr("label"), children:[], element: element.get(), css: element.attr("class")};
3788- element.children().each2(function(i, elm) { process(elm, group.children); });
3789- if (group.children.length>0) {
3790- collection.push(group);
3791- }
3792- }
3793- };
3794-
3795- children=element.children();
3796-
3797- // ignore the placeholder option if there is one
3798- if (this.getPlaceholder() !== undefined && children.length > 0) {
3799- firstChild = children[0];
3800- if ($(firstChild).text() === "") {
3801- children=children.not(firstChild);
3802- }
3803- }
3804-
3805- children.each2(function(i, elm) { process(elm, data.results); });
3806-
3807- query.callback(data);
3808- });
3809- // this is needed because inside val() we construct choices from options and there id is hardcoded
3810- opts.id=function(e) { return e.id; };
3811- opts.formatResultCssClass = function(data) { return data.css; }
3812- } else {
3813- if (!("query" in opts)) {
3814- if ("ajax" in opts) {
3815- ajaxUrl = opts.element.data("ajax-url");
3816- if (ajaxUrl && ajaxUrl.length > 0) {
3817- opts.ajax.url = ajaxUrl;
3818- }
3819- opts.query = ajax(opts.ajax);
3820- } else if ("data" in opts) {
3821- opts.query = local(opts.data);
3822- } else if ("tags" in opts) {
3823- opts.query = tags(opts.tags);
3824- opts.createSearchChoice = function (term) { return {id: term, text: term}; };
3825- opts.initSelection = function (element, callback) {
3826- var data = [];
3827- $(splitVal(element.val(), opts.separator)).each(function () {
3828- var id = this, text = this, tags=opts.tags;
3829- if ($.isFunction(tags)) tags=tags();
3830- $(tags).each(function() { if (equal(this.id, id)) { text = this.text; return false; } });
3831- data.push({id: id, text: text});
3832- });
3833-
3834- callback(data);
3835- };
3836- }
3837- }
3838- }
3839- if (typeof(opts.query) !== "function") {
3840- throw "query function not defined for Select2 " + opts.element.attr("id");
3841- }
3842-
3843- return opts;
3844- },
3845-
3846- /**
3847- * Monitor the original element for changes and update select2 accordingly
3848- */
3849- // abstract
3850- monitorSource: function () {
3851- this.opts.element.bind("change.select2", this.bind(function (e) {
3852- if (this.opts.element.data("select2-change-triggered") !== true) {
3853- this.initSelection();
3854- }
3855- }));
3856- },
3857-
3858- /**
3859- * Triggers the change event on the source element
3860- */
3861- // abstract
3862- triggerChange: function (details) {
3863-
3864- details = details || {};
3865- details= $.extend({}, details, { type: "change", val: this.val() });
3866- // prevents recursive triggering
3867- this.opts.element.data("select2-change-triggered", true);
3868- this.opts.element.trigger(details);
3869- this.opts.element.data("select2-change-triggered", false);
3870-
3871- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
3872- // so here we trigger the click event manually
3873- this.opts.element.click();
3874-
3875- // ValidationEngine ignorea the change event and listens instead to blur
3876- // so here we trigger the blur event manually if so desired
3877- if (this.opts.blurOnChange)
3878- this.opts.element.blur();
3879- },
3880-
3881-
3882- // abstract
3883- enable: function() {
3884- if (this.enabled) return;
3885-
3886- this.enabled=true;
3887- this.container.removeClass("select2-container-disabled");
3888- },
3889-
3890- // abstract
3891- disable: function() {
3892- if (!this.enabled) return;
3893-
3894- this.close();
3895-
3896- this.enabled=false;
3897- this.container.addClass("select2-container-disabled");
3898- },
3899-
3900- // abstract
3901- opened: function () {
3902- return this.container.hasClass("select2-dropdown-open");
3903- },
3904-
3905- // abstract
3906- positionDropdown: function() {
3907- var offset = this.container.offset(),
3908- height = this.container.outerHeight(),
3909- width = this.container.outerWidth(),
3910- dropHeight = this.dropdown.outerHeight(),
3911- viewportBottom = $(window).scrollTop() + document.documentElement.clientHeight,
3912- dropTop = offset.top + height,
3913- dropLeft = offset.left,
3914- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
3915- enoughRoomAbove = (offset.top - dropHeight) >= this.body().scrollTop(),
3916- aboveNow = this.dropdown.hasClass("select2-drop-above"),
3917- bodyOffset,
3918- above,
3919- css;
3920-
3921- // console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
3922- // console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body().scrollTop(), "enough?", enoughRoomAbove);
3923-
3924- // fix positioning when body has an offset and is not position: static
3925-
3926- if (this.body().css('position') !== 'static') {
3927- bodyOffset = this.body().offset();
3928- dropTop -= bodyOffset.top;
3929- dropLeft -= bodyOffset.left;
3930- }
3931-
3932- // always prefer the current above/below alignment, unless there is not enough room
3933-
3934- if (aboveNow) {
3935- above = true;
3936- if (!enoughRoomAbove && enoughRoomBelow) above = false;
3937- } else {
3938- above = false;
3939- if (!enoughRoomBelow && enoughRoomAbove) above = true;
3940- }
3941-
3942- if (above) {
3943- dropTop = offset.top - dropHeight;
3944- this.container.addClass("select2-drop-above");
3945- this.dropdown.addClass("select2-drop-above");
3946- }
3947- else {
3948- this.container.removeClass("select2-drop-above");
3949- this.dropdown.removeClass("select2-drop-above");
3950- }
3951-
3952- css = $.extend({
3953- top: dropTop,
3954- left: dropLeft,
3955- width: width
3956- }, evaluate(this.opts.dropdownCss));
3957-
3958- this.dropdown.css(css);
3959- },
3960-
3961- // abstract
3962- shouldOpen: function() {
3963- var event;
3964-
3965- if (this.opened()) return false;
3966-
3967- event = jQuery.Event("open");
3968- this.opts.element.trigger(event);
3969- return !event.isDefaultPrevented();
3970- },
3971-
3972- // abstract
3973- clearDropdownAlignmentPreference: function() {
3974- // clear the classes used to figure out the preference of where the dropdown should be opened
3975- this.container.removeClass("select2-drop-above");
3976- this.dropdown.removeClass("select2-drop-above");
3977- },
3978-
3979- /**
3980- * Opens the dropdown
3981- *
3982- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
3983- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
3984- */
3985- // abstract
3986- open: function () {
3987-
3988- if (!this.shouldOpen()) return false;
3989-
3990- window.setTimeout(this.bind(this.opening), 1);
3991-
3992- return true;
3993- },
3994-
3995- /**
3996- * Performs the opening of the dropdown
3997- */
3998- // abstract
3999- opening: function() {
4000- var cid = this.containerId, selector = this.containerSelector,
4001- scroll = "scroll." + cid, resize = "resize." + cid;
4002-
4003- this.container.parents().each(function() {
4004- $(this).bind(scroll, function() {
4005- var s2 = $(selector);
4006- if (s2.length == 0) {
4007- $(this).unbind(scroll);
4008- }
4009- s2.select2("close");
4010- });
4011- });
4012-
4013- $(window).bind(resize, function() {
4014- var s2 = $(selector);
4015- if (s2.length == 0) {
4016- $(window).unbind(resize);
4017- }
4018- s2.select2("close");
4019- });
4020-
4021- this.clearDropdownAlignmentPreference();
4022-
4023- if (this.search.val() === " ") { this.search.val(""); }
4024-
4025- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
4026-
4027- this.updateResults(true);
4028-
4029- if(this.dropdown[0] !== this.body().children().last()[0]) {
4030- this.dropdown.detach().appendTo(this.body());
4031- }
4032-
4033- this.dropdown.show();
4034-
4035- this.positionDropdown();
4036- this.dropdown.addClass("select2-drop-active");
4037-
4038- this.ensureHighlightVisible();
4039-
4040- this.focusSearch();
4041- },
4042-
4043- // abstract
4044- close: function () {
4045- if (!this.opened()) return;
4046-
4047- var self = this;
4048-
4049- this.container.parents().each(function() {
4050- $(this).unbind("scroll." + self.containerId);
4051- });
4052- $(window).unbind("resize." + this.containerId);
4053-
4054- this.clearDropdownAlignmentPreference();
4055-
4056- this.dropdown.hide();
4057- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
4058- this.results.empty();
4059- this.clearSearch();
4060-
4061- this.opts.element.trigger(jQuery.Event("close"));
4062- },
4063-
4064- // abstract
4065- clearSearch: function () {
4066-
4067- },
4068-
4069- // abstract
4070- ensureHighlightVisible: function () {
4071- var results = this.results, children, index, child, hb, rb, y, more;
4072-
4073- index = this.highlight();
4074-
4075- if (index < 0) return;
4076-
4077- if (index == 0) {
4078-
4079- // if the first element is highlighted scroll all the way to the top,
4080- // that way any unselectable headers above it will also be scrolled
4081- // into view
4082-
4083- results.scrollTop(0);
4084- return;
4085- }
4086-
4087- children = results.find(".select2-result-selectable");
4088-
4089- child = $(children[index]);
4090-
4091- hb = child.offset().top + child.outerHeight();
4092-
4093- // if this is the last child lets also make sure select2-more-results is visible
4094- if (index === children.length - 1) {
4095- more = results.find("li.select2-more-results");
4096- if (more.length > 0) {
4097- hb = more.offset().top + more.outerHeight();
4098- }
4099- }
4100-
4101- rb = results.offset().top + results.outerHeight();
4102- if (hb > rb) {
4103- results.scrollTop(results.scrollTop() + (hb - rb));
4104- }
4105- y = child.offset().top - results.offset().top;
4106-
4107- // make sure the top of the element is visible
4108- if (y < 0) {
4109- results.scrollTop(results.scrollTop() + y); // y is negative
4110- }
4111- },
4112-
4113- // abstract
4114- moveHighlight: function (delta) {
4115- var choices = this.results.find(".select2-result-selectable"),
4116- index = this.highlight();
4117-
4118- while (index > -1 && index < choices.length) {
4119- index += delta;
4120- var choice = $(choices[index]);
4121- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled")) {
4122- this.highlight(index);
4123- break;
4124- }
4125- }
4126- },
4127-
4128- // abstract
4129- highlight: function (index) {
4130- var choices = this.results.find(".select2-result-selectable").not(".select2-disabled");
4131-
4132- if (arguments.length === 0) {
4133- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
4134- }
4135-
4136- if (index >= choices.length) index = choices.length - 1;
4137- if (index < 0) index = 0;
4138-
4139- choices.removeClass("select2-highlighted");
4140-
4141- $(choices[index]).addClass("select2-highlighted");
4142- this.ensureHighlightVisible();
4143-
4144- },
4145-
4146- // abstract
4147- countSelectableResults: function() {
4148- return this.results.find(".select2-result-selectable").not(".select2-disabled").length;
4149- },
4150-
4151- // abstract
4152- highlightUnderEvent: function (event) {
4153- var el = $(event.target).closest(".select2-result-selectable");
4154- if (el.length > 0 && !el.is(".select2-highlighted")) {
4155- var choices = this.results.find('.select2-result-selectable');
4156- this.highlight(choices.index(el));
4157- } else if (el.length == 0) {
4158- // if we are over an unselectable item remove al highlights
4159- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
4160- }
4161- },
4162-
4163- // abstract
4164- loadMoreIfNeeded: function () {
4165- var results = this.results,
4166- more = results.find("li.select2-more-results"),
4167- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
4168- offset = -1, // index of first element without data
4169- page = this.resultsPage + 1,
4170- self=this,
4171- term=this.search.val(),
4172- context=this.context;
4173-
4174- if (more.length === 0) return;
4175- below = more.offset().top - results.offset().top - results.height();
4176-
4177- if (below <= 0) {
4178- more.addClass("select2-active");
4179- this.opts.query({
4180- term: term,
4181- page: page,
4182- context: context,
4183- matcher: this.opts.matcher,
4184- callback: this.bind(function (data) {
4185-
4186- // ignore a response if the select2 has been closed before it was received
4187- if (!self.opened()) return;
4188-
4189-
4190- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
4191-
4192- if (data.more===true) {
4193- more.detach().appendTo(results).text(self.opts.formatLoadMore(page+1));
4194- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
4195- } else {
4196- more.remove();
4197- }
4198- self.positionDropdown();
4199- self.resultsPage = page;
4200- })});
4201- }
4202- },
4203-
4204- /**
4205- * Default tokenizer function which does nothing
4206- */
4207- tokenize: function() {
4208-
4209- },
4210-
4211- /**
4212- * @param initial whether or not this is the call to this method right after the dropdown has been opened
4213- */
4214- // abstract
4215- updateResults: function (initial) {
4216- var search = this.search, results = this.results, opts = this.opts, data, self=this, input;
4217-
4218- // if the search is currently hidden we do not alter the results
4219- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
4220- return;
4221- }
4222-
4223- search.addClass("select2-active");
4224-
4225- function postRender() {
4226- results.scrollTop(0);
4227- search.removeClass("select2-active");
4228- self.positionDropdown();
4229- }
4230-
4231- function render(html) {
4232- results.html(self.opts.escapeMarkup(html));
4233- postRender();
4234- }
4235-
4236- if (opts.maximumSelectionSize >=1) {
4237- data = this.data();
4238- if ($.isArray(data) && data.length >= opts.maximumSelectionSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
4239- render("<li class='select2-selection-limit'>" + opts.formatSelectionTooBig(opts.maximumSelectionSize) + "</li>");
4240- return;
4241- }
4242- }
4243-
4244- if (search.val().length < opts.minimumInputLength && checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
4245- render("<li class='select2-no-results'>" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + "</li>");
4246- return;
4247- }
4248- else {
4249- render("<li class='select2-searching'>" + opts.formatSearching() + "</li>");
4250- }
4251-
4252- // give the tokenizer a chance to pre-process the input
4253- input = this.tokenize();
4254- if (input != undefined && input != null) {
4255- search.val(input);
4256- }
4257-
4258- this.resultsPage = 1;
4259- opts.query({
4260- term: search.val(),
4261- page: this.resultsPage,
4262- context: null,
4263- matcher: opts.matcher,
4264- callback: this.bind(function (data) {
4265- var def; // default choice
4266-
4267- // ignore a response if the select2 has been closed before it was received
4268- if (!this.opened()) return;
4269-
4270- // save context, if any
4271- this.context = (data.context===undefined) ? null : data.context;
4272-
4273- // create a default choice and prepend it to the list
4274- if (this.opts.createSearchChoice && search.val() !== "") {
4275- def = this.opts.createSearchChoice.call(null, search.val(), data.results);
4276- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
4277- if ($(data.results).filter(
4278- function () {
4279- return equal(self.id(this), self.id(def));
4280- }).length === 0) {
4281- data.results.unshift(def);
4282- }
4283- }
4284- }
4285-
4286- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
4287- render("<li class='select2-no-results'>" + opts.formatNoMatches(search.val()) + "</li>");
4288- return;
4289- }
4290-
4291- results.empty();
4292- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
4293-
4294- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
4295- results.append("<li class='select2-more-results'>" + self.opts.escapeMarkup(opts.formatLoadMore(this.resultsPage)) + "</li>");
4296- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
4297- }
4298-
4299- this.postprocessResults(data, initial);
4300-
4301- postRender();
4302- })});
4303- },
4304-
4305- // abstract
4306- cancel: function () {
4307- this.close();
4308- },
4309-
4310- // abstract
4311- blur: function () {
4312- this.close();
4313- this.container.removeClass("select2-container-active");
4314- this.dropdown.removeClass("select2-drop-active");
4315- // synonymous to .is(':focus'), which is available in jquery >= 1.6
4316- if (this.search[0] === document.activeElement) { this.search.blur(); }
4317- this.clearSearch();
4318- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
4319- },
4320-
4321- // abstract
4322- focusSearch: function () {
4323- // need to do it here as well as in timeout so it works in IE
4324- this.search.show();
4325- this.search.focus();
4326-
4327- /* we do this in a timeout so that current event processing can complete before this code is executed.
4328- this makes sure the search field is focussed even if the current event would blur it */
4329- window.setTimeout(this.bind(function () {
4330- // reset the value so IE places the cursor at the end of the input box
4331- this.search.show();
4332- this.search.focus();
4333- this.search.val(this.search.val());
4334- }), 10);
4335- },
4336-
4337- // abstract
4338- selectHighlighted: function () {
4339- var index=this.highlight(),
4340- highlighted=this.results.find(".select2-highlighted").not(".select2-disabled"),
4341- data = highlighted.closest('.select2-result-selectable').data("select2-data");
4342- if (data) {
4343- highlighted.addClass("select2-disabled");
4344- this.highlight(index);
4345- this.onSelect(data);
4346- }
4347- },
4348-
4349- // abstract
4350- getPlaceholder: function () {
4351- return this.opts.element.attr("placeholder") ||
4352- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
4353- this.opts.element.data("placeholder") ||
4354- this.opts.placeholder;
4355- },
4356-
4357- /**
4358- * Get the desired width for the container element. This is
4359- * derived first from option `width` passed to select2, then
4360- * the inline 'style' on the original element, and finally
4361- * falls back to the jQuery calculated element width.
4362- */
4363- // abstract
4364- initContainerWidth: function () {
4365- function resolveContainerWidth() {
4366- var style, attrs, matches, i, l;
4367-
4368- if (this.opts.width === "off") {
4369- return null;
4370- } else if (this.opts.width === "element"){
4371- return this.opts.element.outerWidth() === 0 ? 'auto' : this.opts.element.outerWidth() + 'px';
4372- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
4373- // check if there is inline style on the element that contains width
4374- style = this.opts.element.attr('style');
4375- if (style !== undefined) {
4376- attrs = style.split(';');
4377- for (i = 0, l = attrs.length; i < l; i = i + 1) {
4378- matches = attrs[i].replace(/\s/g, '')
4379- .match(/width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/);
4380- if (matches !== null && matches.length >= 1)
4381- return matches[1];
4382- }
4383- }
4384-
4385- if (this.opts.width === "resolve") {
4386- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
4387- // when attached to input type=hidden or elements hidden via css
4388- style = this.opts.element.css('width');
4389- if (style.indexOf("%") > 0) return style;
4390-
4391- // finally, fallback on the calculated width of the element
4392- return (this.opts.element.outerWidth() === 0 ? 'auto' : this.opts.element.outerWidth() + 'px');
4393- }
4394-
4395- return null;
4396- } else if ($.isFunction(this.opts.width)) {
4397- return this.opts.width();
4398- } else {
4399- return this.opts.width;
4400- }
4401- };
4402-
4403- var width = resolveContainerWidth.call(this);
4404- if (width !== null) {
4405- this.container.attr("style", "width: "+width);
4406- }
4407- }
4408- });
4409-
4410- SingleSelect2 = clazz(AbstractSelect2, {
4411-
4412- // single
4413-
4414- createContainer: function () {
4415- var container = $("<div></div>", {
4416- "class": "select2-container"
4417- }).html([
4418- " <a href='#' onclick='return false;' class='select2-choice'>",
4419- " <span></span><abbr class='select2-search-choice-close' style='display:none;'></abbr>",
4420- " <div><b></b></div>" ,
4421- "</a>",
4422- " <div class='select2-drop select2-offscreen'>" ,
4423- " <div class='select2-search'>" ,
4424- " <input type='text' autocomplete='off' class='select2-input'/>" ,
4425- " </div>" ,
4426- " <ul class='select2-results'>" ,
4427- " </ul>" ,
4428- "</div>"].join(""));
4429- return container;
4430- },
4431-
4432- // single
4433- opening: function () {
4434- this.search.show();
4435- this.parent.opening.apply(this, arguments);
4436- this.dropdown.removeClass("select2-offscreen");
4437- },
4438-
4439- // single
4440- close: function () {
4441- if (!this.opened()) return;
4442- this.parent.close.apply(this, arguments);
4443- this.dropdown.removeAttr("style").addClass("select2-offscreen").insertAfter(this.selection).show();
4444- },
4445-
4446- // single
4447- focus: function () {
4448- this.close();
4449- this.selection.focus();
4450- },
4451-
4452- // single
4453- isFocused: function () {
4454- return this.selection[0] === document.activeElement;
4455- },
4456-
4457- // single
4458- cancel: function () {
4459- this.parent.cancel.apply(this, arguments);
4460- this.selection.focus();
4461- },
4462-
4463- // single
4464- initContainer: function () {
4465-
4466- var selection,
4467- container = this.container,
4468- dropdown = this.dropdown,
4469- clickingInside = false;
4470-
4471- this.selection = selection = container.find(".select2-choice");
4472-
4473- this.search.bind("keydown", this.bind(function (e) {
4474- if (!this.enabled) return;
4475-
4476- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
4477- // prevent the page from scrolling
4478- killEvent(e);
4479- return;
4480- }
4481-
4482- if (this.opened()) {
4483- switch (e.which) {
4484- case KEY.UP:
4485- case KEY.DOWN:
4486- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
4487- killEvent(e);
4488- return;
4489- case KEY.TAB:
4490- case KEY.ENTER:
4491- this.selectHighlighted();
4492- killEvent(e);
4493- return;
4494- case KEY.ESC:
4495- this.cancel(e);
4496- killEvent(e);
4497- return;
4498- }
4499- } else {
4500-
4501- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
4502- return;
4503- }
4504-
4505- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
4506- return;
4507- }
4508-
4509- this.open();
4510-
4511- if (e.which === KEY.ENTER) {
4512- // do not propagate the event otherwise we open, and propagate enter which closes
4513- return;
4514- }
4515- }
4516- }));
4517-
4518- this.search.bind("focus", this.bind(function() {
4519- this.selection.attr("tabIndex", "-1");
4520- }));
4521- this.search.bind("blur", this.bind(function() {
4522- if (!this.opened()) this.container.removeClass("select2-container-active");
4523- window.setTimeout(this.bind(function() { this.selection.attr("tabIndex", this.opts.element.attr("tabIndex")); }), 10);
4524- }));
4525-
4526- selection.bind("mousedown", this.bind(function (e) {
4527- clickingInside = true;
4528-
4529- if (this.opened()) {
4530- this.close();
4531- this.selection.focus();
4532- } else if (this.enabled) {
4533- this.open();
4534- }
4535-
4536- clickingInside = false;
4537- }));
4538-
4539- dropdown.bind("mousedown", this.bind(function() { this.search.focus(); }));
4540-
4541- selection.bind("focus", this.bind(function() {
4542- this.container.addClass("select2-container-active");
4543- // hide the search so the tab key does not focus on it
4544- this.search.attr("tabIndex", "-1");
4545- }));
4546-
4547- selection.bind("blur", this.bind(function() {
4548- if (!this.opened()) {
4549- this.container.removeClass("select2-container-active");
4550- }
4551- window.setTimeout(this.bind(function() { this.search.attr("tabIndex", this.opts.element.attr("tabIndex")); }), 10);
4552- }));
4553-
4554- selection.bind("keydown", this.bind(function(e) {
4555- if (!this.enabled) return;
4556-
4557- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
4558- // prevent the page from scrolling
4559- killEvent(e);
4560- return;
4561- }
4562-
4563- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
4564- || e.which === KEY.ESC) {
4565- return;
4566- }
4567-
4568- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
4569- return;
4570- }
4571-
4572- if (e.which == KEY.DELETE) {
4573- if (this.opts.allowClear) {
4574- this.clear();
4575- }
4576- return;
4577- }
4578-
4579- this.open();
4580-
4581- if (e.which === KEY.ENTER) {
4582- // do not propagate the event otherwise we open, and propagate enter which closes
4583- killEvent(e);
4584- return;
4585- }
4586-
4587- // do not set the search input value for non-alpha-numeric keys
4588- // otherwise pressing down results in a '(' being set in the search field
4589- if (e.which < 48 ) { // '0' == 48
4590- killEvent(e);
4591- return;
4592- }
4593-
4594- var keyWritten = String.fromCharCode(e.which).toLowerCase();
4595-
4596- if (e.shiftKey) {
4597- keyWritten = keyWritten.toUpperCase();
4598- }
4599-
4600- // focus the field before calling val so the cursor ends up after the value instead of before
4601- this.search.focus();
4602- this.search.val(keyWritten);
4603-
4604- // prevent event propagation so it doesnt replay on the now focussed search field and result in double key entry
4605- killEvent(e);
4606- }));
4607-
4608- selection.delegate("abbr", "mousedown", this.bind(function (e) {
4609- if (!this.enabled) return;
4610- this.clear();
4611- killEvent(e);
4612- this.close();
4613- this.triggerChange();
4614- this.selection.focus();
4615- }));
4616-
4617- this.setPlaceholder();
4618-
4619- this.search.bind("focus", this.bind(function() {
4620- this.container.addClass("select2-container-active");
4621- }));
4622- },
4623-
4624- // single
4625- clear: function() {
4626- this.opts.element.val("");
4627- this.selection.find("span").empty();
4628- this.selection.removeData("select2-data");
4629- this.setPlaceholder();
4630- },
4631-
4632- /**
4633- * Sets selection based on source element's value
4634- */
4635- // single
4636- initSelection: function () {
4637- var selected;
4638- if (this.opts.element.val() === "") {
4639- this.close();
4640- this.setPlaceholder();
4641- } else {
4642- var self = this;
4643- this.opts.initSelection.call(null, this.opts.element, function(selected){
4644- if (selected !== undefined && selected !== null) {
4645- self.updateSelection(selected);
4646- self.close();
4647- self.setPlaceholder();
4648- }
4649- });
4650- }
4651- },
4652-
4653- // single
4654- prepareOpts: function () {
4655- var opts = this.parent.prepareOpts.apply(this, arguments);
4656-
4657- if (opts.element.get(0).tagName.toLowerCase() === "select") {
4658- // install the selection initializer
4659- opts.initSelection = function (element, callback) {
4660- var selected = element.find(":selected");
4661- // a single select box always has a value, no need to null check 'selected'
4662- if ($.isFunction(callback))
4663- callback({id: selected.attr("value"), text: selected.text()});
4664- };
4665- }
4666-
4667- return opts;
4668- },
4669-
4670- // single
4671- setPlaceholder: function () {
4672- var placeholder = this.getPlaceholder();
4673-
4674- if (this.opts.element.val() === "" && placeholder !== undefined) {
4675-
4676- // check for a first blank option if attached to a select
4677- if (this.select && this.select.find("option:first").text() !== "") return;
4678-
4679- this.selection.find("span").html(this.opts.escapeMarkup(placeholder));
4680-
4681- this.selection.addClass("select2-default");
4682-
4683- this.selection.find("abbr").hide();
4684- }
4685- },
4686-
4687- // single
4688- postprocessResults: function (data, initial) {
4689- var selected = 0, self = this, showSearchInput = true;
4690-
4691- // find the selected element in the result list
4692-
4693- this.results.find(".select2-result-selectable").each2(function (i, elm) {
4694- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
4695- selected = i;
4696- return false;
4697- }
4698- });
4699-
4700- // and highlight it
4701-
4702- this.highlight(selected);
4703-
4704- // hide the search box if this is the first we got the results and there are a few of them
4705-
4706- if (initial === true) {
4707- showSearchInput = this.showSearchInput = countResults(data.results) >= this.opts.minimumResultsForSearch;
4708- this.dropdown.find(".select2-search")[showSearchInput ? "removeClass" : "addClass"]("select2-search-hidden");
4709-
4710- //add "select2-with-searchbox" to the container if search box is shown
4711- $(this.dropdown, this.container)[showSearchInput ? "addClass" : "removeClass"]("select2-with-searchbox");
4712- }
4713-
4714- },
4715-
4716- // single
4717- onSelect: function (data) {
4718- var old = this.opts.element.val();
4719-
4720- this.opts.element.val(this.id(data));
4721- this.updateSelection(data);
4722- this.close();
4723- this.selection.focus();
4724-
4725- if (!equal(old, this.id(data))) { this.triggerChange(); }
4726- },
4727-
4728- // single
4729- updateSelection: function (data) {
4730-
4731- var container=this.selection.find("span"), formatted;
4732-
4733- this.selection.data("select2-data", data);
4734-
4735- container.empty();
4736- formatted=this.opts.formatSelection(data, container);
4737- if (formatted !== undefined) {
4738- container.append(this.opts.escapeMarkup(formatted));
4739- }
4740-
4741- this.selection.removeClass("select2-default");
4742-
4743- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
4744- this.selection.find("abbr").show();
4745- }
4746- },
4747-
4748- // single
4749- val: function () {
4750- var val, data = null, self = this;
4751-
4752- if (arguments.length === 0) {
4753- return this.opts.element.val();
4754- }
4755-
4756- val = arguments[0];
4757-
4758- if (this.select) {
4759- this.select
4760- .val(val)
4761- .find(":selected").each2(function (i, elm) {
4762- data = {id: elm.attr("value"), text: elm.text()};
4763- return false;
4764- });
4765- this.updateSelection(data);
4766- this.setPlaceholder();
4767- } else {
4768- if (this.opts.initSelection === undefined) {
4769- throw new Error("cannot call val() if initSelection() is not defined");
4770- }
4771- // val is an id. !val is true for [undefined,null,'']
4772- if (!val) {
4773- this.clear();
4774- return;
4775- }
4776- this.opts.element.val(val);
4777- this.opts.initSelection(this.opts.element, function(data){
4778- self.opts.element.val(!data ? "" : self.id(data));
4779- self.updateSelection(data);
4780- self.setPlaceholder();
4781- });
4782- }
4783- },
4784-
4785- // single
4786- clearSearch: function () {
4787- this.search.val("");
4788- },
4789-
4790- // single
4791- data: function(value) {
4792- var data;
4793-
4794- if (arguments.length === 0) {
4795- data = this.selection.data("select2-data");
4796- if (data == undefined) data = null;
4797- return data;
4798- } else {
4799- if (!value || value === "") {
4800- this.clear();
4801- } else {
4802- this.opts.element.val(!value ? "" : this.id(value));
4803- this.updateSelection(value);
4804- }
4805- }
4806- }
4807- });
4808-
4809- MultiSelect2 = clazz(AbstractSelect2, {
4810-
4811- // multi
4812- createContainer: function () {
4813- var container = $("<div></div>", {
4814- "class": "select2-container select2-container-multi"
4815- }).html([
4816- " <ul class='select2-choices'>",
4817- //"<li class='select2-search-choice'><span>California</span><a href="javascript:void(0)" class="select2-search-choice-close"></a></li>" ,
4818- " <li class='select2-search-field'>" ,
4819- " <input type='text' autocomplete='off' class='select2-input'>" ,
4820- " </li>" ,
4821- "</ul>" ,
4822- "<div class='select2-drop select2-drop-multi' style='display:none;'>" ,
4823- " <ul class='select2-results'>" ,
4824- " </ul>" ,
4825- "</div>"].join(""));
4826- return container;
4827- },
4828-
4829- // multi
4830- prepareOpts: function () {
4831- var opts = this.parent.prepareOpts.apply(this, arguments);
4832-
4833- // TODO validate placeholder is a string if specified
4834-
4835- if (opts.element.get(0).tagName.toLowerCase() === "select") {
4836- // install sthe selection initializer
4837- opts.initSelection = function (element,callback) {
4838-
4839- var data = [];
4840- element.find(":selected").each2(function (i, elm) {
4841- data.push({id: elm.attr("value"), text: elm.text()});
4842- });
4843-
4844- if ($.isFunction(callback))
4845- callback(data);
4846- };
4847- }
4848-
4849- return opts;
4850- },
4851-
4852- // multi
4853- initContainer: function () {
4854-
4855- var selector = ".select2-choices", selection;
4856-
4857- this.searchContainer = this.container.find(".select2-search-field");
4858- this.selection = selection = this.container.find(selector);
4859-
4860- this.search.bind("keydown", this.bind(function (e) {
4861- if (!this.enabled) return;
4862-
4863- if (e.which === KEY.BACKSPACE && this.search.val() === "") {
4864- this.close();
4865-
4866- var choices,
4867- selected = selection.find(".select2-search-choice-focus");
4868- if (selected.length > 0) {
4869- this.unselect(selected.first());
4870- this.search.width(10);
4871- killEvent(e);
4872- return;
4873- }
4874-
4875- choices = selection.find(".select2-search-choice");
4876- if (choices.length > 0) {
4877- choices.last().addClass("select2-search-choice-focus");
4878- }
4879- } else {
4880- selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
4881- }
4882-
4883- if (this.opened()) {
4884- switch (e.which) {
4885- case KEY.UP:
4886- case KEY.DOWN:
4887- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
4888- killEvent(e);
4889- return;
4890- case KEY.ENTER:
4891- case KEY.TAB:
4892- this.selectHighlighted();
4893- killEvent(e);
4894- return;
4895- case KEY.ESC:
4896- this.cancel(e);
4897- killEvent(e);
4898- return;
4899- }
4900- }
4901-
4902- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
4903- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
4904- return;
4905- }
4906-
4907- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
4908- return;
4909- }
4910-
4911- this.open();
4912-
4913- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
4914- // prevent the page from scrolling
4915- killEvent(e);
4916- }
4917- }));
4918-
4919- this.search.bind("keyup", this.bind(this.resizeSearch));
4920-
4921- this.search.bind("blur", this.bind(function(e) {
4922- this.container.removeClass("select2-container-active");
4923- this.search.removeClass("select2-focused");
4924- this.clearSearch();
4925- e.stopImmediatePropagation();
4926- }));
4927-
4928- this.container.delegate(selector, "mousedown", this.bind(function (e) {
4929- if (!this.enabled) return;
4930- if ($(e.target).closest(".select2-search-choice").length > 0) {
4931- // clicked inside a select2 search choice, do not open
4932- return;
4933- }
4934- this.clearPlaceholder();
4935- this.open();
4936- this.focusSearch();
4937- e.preventDefault();
4938- }));
4939-
4940- this.container.delegate(selector, "focus", this.bind(function () {
4941- if (!this.enabled) return;
4942- this.container.addClass("select2-container-active");
4943- this.dropdown.addClass("select2-drop-active");
4944- this.clearPlaceholder();
4945- }));
4946-
4947- // set the placeholder if necessary
4948- this.clearSearch();
4949- },
4950-
4951- // multi
4952- enable: function() {
4953- if (this.enabled) return;
4954-
4955- this.parent.enable.apply(this, arguments);
4956-
4957- this.search.removeAttr("disabled");
4958- },
4959-
4960- // multi
4961- disable: function() {
4962- if (!this.enabled) return;
4963-
4964- this.parent.disable.apply(this, arguments);
4965-
4966- this.search.attr("disabled", true);
4967- },
4968-
4969- // multi
4970- initSelection: function () {
4971- var data;
4972- if (this.opts.element.val() === "") {
4973- this.updateSelection([]);
4974- this.close();
4975- // set the placeholder if necessary
4976- this.clearSearch();
4977- }
4978- if (this.select || this.opts.element.val() !== "") {
4979- var self = this;
4980- this.opts.initSelection.call(null, this.opts.element, function(data){
4981- if (data !== undefined && data !== null) {
4982- self.updateSelection(data);
4983- self.close();
4984- // set the placeholder if necessary
4985- self.clearSearch();
4986- }
4987- });
4988- }
4989- },
4990-
4991- // multi
4992- clearSearch: function () {
4993- var placeholder = this.getPlaceholder();
4994-
4995- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
4996- this.search.val(placeholder).addClass("select2-default");
4997- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
4998- this.resizeSearch();
4999- } else {
5000- // we set this to " " instead of "" and later clear it on focus() because there is a firefox bug
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: