mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-10 05:02:36 +01:00
1 line
395 KiB
Plaintext
1 line
395 KiB
Plaintext
{"version":3,"sources":["quill.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"quill.min.js","sourcesContent":["/*! Quill Editor v0.20.1\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.Quill = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n(function (global){\n/**\n * @license\n * lodash 3.9.3 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern include=\"difference,intersection,last,all,each,find,invoke,map,reduce,partition,bind,defer,partial,clone,extend,defaults,omit,values,isElement,isEqual,isFunction,isNumber,isObject,isString,uniqueId\" --development --output .build/lodash.js`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '3.9.3';\n\n /** Used to compose bitmasks for wrapper metadata. */\n var BIND_FLAG = 1,\n BIND_KEY_FLAG = 2,\n CURRY_BOUND_FLAG = 4,\n CURRY_FLAG = 8,\n CURRY_RIGHT_FLAG = 16,\n PARTIAL_FLAG = 32,\n PARTIAL_RIGHT_FLAG = 64,\n ARY_FLAG = 128,\n REARG_FLAG = 256;\n\n /** Used to detect when a function becomes hot. */\n var HOT_COUNT = 150,\n HOT_SPAN = 16;\n\n /** Used as the `TypeError` message for \"Functions\" methods. */\n var FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n /**\n * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).\n * In addition to special characters the forward slash is escaped to allow for\n * easier `eval` use and `Function` compilation.\n */\n var reRegExpChars = /[.*+?^${}()|[\\]\\/\\\\]/g,\n reHasRegExpChars = RegExp(reRegExpChars.source);\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect host constructors (Safari > 5). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^\\d+$/;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dateTag] = typedArrayTags[errorTag] =\n typedArrayTags[funcTag] = typedArrayTags[mapTag] =\n typedArrayTags[numberTag] = typedArrayTags[objectTag] =\n typedArrayTags[regexpTag] = typedArrayTags[setTag] =\n typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =\n cloneableTags[dateTag] = cloneableTags[float32Tag] =\n cloneableTags[float64Tag] = cloneableTags[int8Tag] =\n cloneableTags[int16Tag] = cloneableTags[int32Tag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[stringTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[mapTag] = cloneableTags[setTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to determine if values are of the language type `Object`. */\n var objectTypes = {\n 'function': true,\n 'object': true\n };\n\n /** Detect free variable `exports`. */\n var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = objectTypes[typeof self] && self && self.Object && self;\n\n /** Detect free variable `window`. */\n var freeWindow = objectTypes[typeof window] && window && window.Object && window;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n /**\n * Used as a reference to the global object.\n *\n * The `this` value is used if it's the global object to avoid Greasemonkey's\n * restricted `window` object, otherwise the `window` object is used.\n */\n var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for callback shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without support for binary searches.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n if (value !== value) {\n return indexOfNaN(array, fromIndex);\n }\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isFunction` without support for environments\n * with incorrect `typeof` results.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n */\n function baseIsFunction(value) {\n // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n return typeof value == 'function' || false;\n }\n\n /**\n * Converts `value` to a string if it's not one. An empty string is returned\n * for `null` or `undefined` values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n if (typeof value == 'string') {\n return value;\n }\n return value == null ? '' : (value + '');\n }\n\n /**\n * Gets the index at which the first occurrence of `NaN` is found in `array`.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched `NaN`, else `-1`.\n */\n function indexOfNaN(array, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 0 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n var other = array[index];\n if (other !== other) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * Checks if `value` is object-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n */\n function isObjectLike(value) {\n return !!value && typeof value == 'object';\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n if (array[index] === placeholder) {\n array[index] = PLACEHOLDER;\n result[++resIndex] = index;\n }\n }\n return result;\n }\n\n /*--------------------------------------------------------------------------*/\n\n /** Used for native method references. */\n var objectProto = Object.prototype;\n\n /** Used to detect DOM support. */\n var document = (document = root.window) ? document.document : null;\n\n /** Used to resolve the decompiled source of functions. */\n var fnToString = Function.prototype.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /**\n * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)\n * of values.\n */\n var objToString = objectProto.toString;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n escapeRegExp(fnToString.call(hasOwnProperty))\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Native method references. */\n var ArrayBuffer = getNative(root, 'ArrayBuffer'),\n bufferSlice = getNative(ArrayBuffer && new ArrayBuffer(0), 'slice'),\n floor = Math.floor,\n getPrototypeOf = getNative(Object, 'getPrototypeOf'),\n Set = getNative(root, 'Set'),\n Uint8Array = getNative(root, 'Uint8Array'),\n WeakMap = getNative(root, 'WeakMap');\n\n /** Used to clone array buffers. */\n var Float64Array = (function() {\n // Safari 5 errors when using an array buffer to initialize a typed array\n // where the array buffer's `byteLength` is not a multiple of the typed\n // array's `BYTES_PER_ELEMENT`.\n try {\n var func = getNative(root, 'Float64Array'),\n result = new func(new ArrayBuffer(10), 0, 1) && func;\n } catch(e) {}\n return result || null;\n }());\n\n /* Native method references for those with the same name as other `lodash` methods. */\n var nativeCreate = getNative(Object, 'create'),\n nativeIsArray = getNative(Array, 'isArray'),\n nativeKeys = getNative(Object, 'keys'),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = getNative(Date, 'now');\n\n /** Used as references for `-Infinity` and `Infinity`. */\n var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used as the size, in bytes, of each `Float64Array` element. */\n var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;\n\n /**\n * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)\n * of an array-like value.\n */\n var MAX_SAFE_INTEGER = 9007199254740991;\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n * Methods that operate on and return arrays, collections, and functions can\n * be chained together. Methods that return a boolean or single value will\n * automatically end the chain returning the unwrapped value. Explicit chaining\n * may be enabled using `_.chain`. The execution of chained methods is lazy,\n * that is, execution is deferred until `_#value` is implicitly or explicitly\n * called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n * fusion is an optimization that merges iteratees to avoid creating intermediate\n * arrays and reduce the number of iteratee executions.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n * `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n * and `where`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`,\n * `difference`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `fill`,\n * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,\n * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,\n * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,\n * `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `method`, `methodOf`, `mixin`, `negate`, `omit`, `once`,\n * `pairs`, `partial`, `partialRight`, `partition`, `pick`, `plant`, `pluck`,\n * `property`, `propertyOf`, `pull`, `pullAt`, `push`, `range`, `rearg`,\n * `reject`, `remove`, `rest`, `restParam`, `reverse`, `set`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`, `spread`,\n * `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, `throttle`,\n * `thru`, `times`, `toArray`, `toPlainObject`, `transform`, `union`, `uniq`,\n * `unshift`, `unzip`, `unzipWith`, `values`, `valuesIn`, `where`, `without`,\n * `wrap`, `xor`, `zip`, `zipObject`, `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`,\n * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,\n * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `get`,\n * `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, `inRange`, `isArguments`,\n * `isArray`, `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,\n * `isFinite` `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,\n * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,\n * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `lt`, `lte`,\n * `max`, `min`, `noConflict`, `noop`, `now`, `pad`, `padLeft`, `padRight`,\n * `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`,\n * `runInContext`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`,\n * `sortedLastIndex`, `startCase`, `startsWith`, `sum`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`\n *\n * The wrapper method `sample` will return a wrapped value when `n` is provided,\n * otherwise an unwrapped value is returned.\n *\n * @name _\n * @constructor\n * @category Chain\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // returns an unwrapped value\n * wrapped.reduce(function(total, n) {\n * return total + n;\n * });\n * // => 6\n *\n * // returns a wrapped value\n * var squares = wrapped.map(function(n) {\n * return n * n;\n * });\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash() {\n // No operation performed.\n }\n\n /**\n * The function whose prototype all chaining wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * An object environment feature flags.\n *\n * @static\n * @memberOf _\n * @type Object\n */\n var support = lodash.support = {};\n\n (function(x) {\n var Ctor = function() { this.x = x; },\n object = { '0': x, 'length': x },\n props = [];\n\n Ctor.prototype = { 'valueOf': x, 'y': x };\n for (var key in new Ctor) { props.push(key); }\n\n /**\n * Detect if the DOM is supported.\n *\n * @memberOf _.support\n * @type boolean\n */\n try {\n support.dom = document.createDocumentFragment().nodeType === 11;\n } catch(e) {\n support.dom = false;\n }\n }(1, 0));\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = null;\n this.__dir__ = 1;\n this.__dropCount__ = 0;\n this.__filtered__ = false;\n this.__iteratees__ = null;\n this.__takeCount__ = POSITIVE_INFINITY;\n this.__views__ = null;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates a cache object to store unique values.\n *\n * @private\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var length = values ? values.length : 0;\n\n this.data = { 'hash': nativeCreate(null), 'set': new Set };\n while (length--) {\n this.push(values[length]);\n }\n }\n\n /**\n * Checks if `value` is in `cache` mimicking the return signature of\n * `_.indexOf` by returning `0` if the value is found, else `-1`.\n *\n * @private\n * @param {Object} cache The cache to search.\n * @param {*} value The value to search for.\n * @returns {number} Returns `0` if `value` is found, else `-1`.\n */\n function cacheIndexOf(cache, value) {\n var data = cache.data,\n result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];\n\n return result ? 0 : -1;\n }\n\n /**\n * Adds `value` to the cache.\n *\n * @private\n * @name push\n * @memberOf SetCache\n * @param {*} value The value to cache.\n */\n function cachePush(value) {\n var data = this.data;\n if (typeof value == 'string' || isObject(value)) {\n data.set.add(value);\n } else {\n data.hash[value] = true;\n }\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function arrayCopy(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initFromArray] Specify using the first element of `array`\n * as the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initFromArray) {\n var index = -1,\n length = array.length;\n\n if (initFromArray && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assign` use.\n *\n * @private\n * @param {*} objectValue The destination object property value.\n * @param {*} sourceValue The source object property value.\n * @returns {*} Returns the value to assign to the destination object.\n */\n function assignDefaults(objectValue, sourceValue) {\n return objectValue === undefined ? sourceValue : objectValue;\n }\n\n /**\n * A specialized version of `_.assign` for customizing assigned values without\n * support for argument juggling, multiple sources, and `this` binding `customizer`\n * functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n */\n function assignWith(object, source, customizer) {\n var index = -1,\n props = keys(source),\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n value = object[key],\n result = customizer(value, source[key], key, object, source);\n\n if ((result === result ? (result !== value) : (value === value)) ||\n (value === undefined && !(key in object))) {\n object[key] = result;\n }\n }\n return object;\n }\n\n /**\n * The base implementation of `_.assign` without support for argument juggling,\n * multiple sources, and `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return source == null\n ? object\n : baseCopy(source, keys(source), object);\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\n function baseCopy(source, props, object) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n object[key] = source[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `_.callback` which supports specifying the\n * number of arguments to provide to `func`.\n *\n * @private\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\n function baseCallback(func, thisArg, argCount) {\n var type = typeof func;\n if (type == 'function') {\n return thisArg === undefined\n ? func\n : bindCallback(func, thisArg, argCount);\n }\n if (func == null) {\n return identity;\n }\n if (type == 'object') {\n return baseMatches(func);\n }\n return thisArg === undefined\n ? property(func)\n : baseMatchesProperty(func, thisArg);\n }\n\n /**\n * The base implementation of `_.clone` without support for argument juggling\n * and `this` binding `customizer` functions.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The object `value` belongs to.\n * @param {Array} [stackA=[]] Tracks traversed source objects.\n * @param {Array} [stackB=[]] Associates clones with source counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return arrayCopy(value, result);\n }\n } else {\n var tag = objToString.call(value),\n isFunc = tag == funcTag;\n\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = initCloneObject(isFunc ? {} : value);\n if (!isDeep) {\n return baseAssign(result, value);\n }\n } else {\n return cloneableTags[tag]\n ? initCloneByTag(value, tag, isDeep)\n : (object ? value : {});\n }\n }\n // Check for circular references and return corresponding clone.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == value) {\n return stackB[length];\n }\n }\n // Add the source value to the stack of traversed objects and associate it with its clone.\n stackA.push(value);\n stackB.push(result);\n\n // Recursively populate clone (susceptible to call stack limits).\n (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {\n result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(prototype) {\n if (isObject(prototype)) {\n object.prototype = prototype;\n var result = new object;\n object.prototype = null;\n }\n return result || {};\n };\n }());\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts an index\n * of where to slice the arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Object} args The arguments provide to `func`.\n * @returns {number} Returns the timer id.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of `_.difference` which accepts a single array\n * of values to exclude.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values) {\n var length = array ? array.length : 0,\n result = [];\n\n if (!length) {\n return result;\n }\n var index = -1,\n indexOf = getIndexOf(),\n isCommon = indexOf == baseIndexOf,\n cache = (isCommon && values.length >= 200) ? createCache(values) : null,\n valuesLength = values.length;\n\n if (cache) {\n indexOf = cacheIndexOf;\n isCommon = false;\n values = cache;\n }\n outer:\n while (++index < length) {\n var value = array[index];\n\n if (isCommon && value === value) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === value) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (indexOf(values, value, 0) < 0) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object|string} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.every` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n * without support for callback shorthands and `this` binding, which iterates\n * over `collection` using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @param {boolean} [retKey] Specify returning the key of the found element\n * instead of the element itself.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFind(collection, predicate, eachFunc, retKey) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = retKey ? key : value;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with added support for restricting\n * flattening and specifying the start index.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {boolean} [isDeep] Specify a deep flatten.\n * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, isDeep, isStrict) {\n var index = -1,\n length = array.length,\n resIndex = -1,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (isObjectLike(value) && isArrayLike(value) &&\n (isStrict || isArray(value) || isArguments(value))) {\n if (isDeep) {\n // Recursively flatten arrays (susceptible to call stack limits).\n value = baseFlatten(value, isDeep, isStrict);\n }\n var valIndex = -1,\n valLength = value.length;\n\n while (++valIndex < valLength) {\n result[++resIndex] = value[valIndex];\n }\n } else if (!isStrict) {\n result[++resIndex] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForIn` and `baseForOwn` which iterates\n * over `object` properties returned by `keysFunc` invoking `iteratee` for\n * each property. Iteratee functions may exit iteration early by explicitly\n * returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * The base implementation of `_.forIn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForIn(object, iteratee) {\n return baseFor(object, iteratee, keysIn);\n }\n\n /**\n * The base implementation of `_.forOwn` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `get` without support for string paths\n * and default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path of the property to get.\n * @param {string} [pathKey] The key representation of path.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path, pathKey) {\n if (object == null) {\n return;\n }\n if (pathKey !== undefined && pathKey in toObject(object)) {\n path = [pathKey];\n }\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[path[index++]];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `_.isEqual` without support for `this` binding\n * `customizer` functions.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = objToString.call(object);\n if (objTag == argsTag) {\n objTag = objectTag;\n } else if (objTag != objectTag) {\n objIsArr = isTypedArray(object);\n }\n }\n if (!othIsArr) {\n othTag = objToString.call(other);\n if (othTag == argsTag) {\n othTag = objectTag;\n } else if (othTag != objectTag) {\n othIsArr = isTypedArray(other);\n }\n }\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && !(objIsArr || objIsObj)) {\n return equalByTag(object, other, objTag);\n }\n if (!isLoose) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n }\n }\n if (!isSameTag) {\n return false;\n }\n // Assume cyclic values are equal.\n // For more information on detecting circular references see https://es5.github.io/#JO.\n stackA || (stackA = []);\n stackB || (stackB = []);\n\n var length = stackA.length;\n while (length--) {\n if (stackA[length] == object) {\n return stackB[length] == other;\n }\n }\n // Add `object` and `other` to the stack of traversed objects.\n stackA.push(object);\n stackB.push(other);\n\n var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n stackA.pop();\n stackB.pop();\n\n return result;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for callback\n * shorthands and `this` binding.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} matchData The propery names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparing objects.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = toObject(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var result = customizer ? customizer(objValue, srcValue, key) : undefined;\n if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.map` without support for callback shorthands\n * and `this` binding.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which does not clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n var key = matchData[0][0],\n value = matchData[0][1];\n\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === value && (value !== undefined || (key in toObject(object)));\n };\n }\n return function(object) {\n return baseIsMatch(object, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to compare.\n * @returns {Function} Returns the new function.\n */\n function baseMatchesProperty(path, srcValue) {\n var isArr = isArray(path),\n isCommon = isKey(path) && isStrictComparable(srcValue),\n pathKey = (path + '');\n\n path = toPath(path);\n return function(object) {\n if (object == null) {\n return false;\n }\n var key = pathKey;\n object = toObject(object);\n if ((isArr || !isCommon) && !(key in object)) {\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n if (object == null) {\n return false;\n }\n key = last(path);\n object = toObject(object);\n }\n return object[key] === srcValue\n ? (srcValue !== undefined || (key in object))\n : baseIsEqual(srcValue, object[key], undefined, true);\n };\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n */\n function basePropertyDeep(path) {\n var pathKey = (path + '');\n path = toPath(path);\n return function(object) {\n return baseGet(object, path, pathKey);\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight` without support\n * for callback shorthands and `this` binding, which iterates over `collection`\n * using the provided `eachFunc`.\n *\n * @private\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initFromCollection Specify using the first or last element\n * of `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initFromCollection\n ? (initFromCollection = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop detection.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n start = start == null ? 0 : (+start || 0);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : (+end || 0);\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n var index = -1,\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = object[props[index]];\n }\n return result;\n }\n\n /**\n * Performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function binaryIndex(array, value, retHighest) {\n var low = 0,\n high = array ? array.length : low;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return binaryIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * This function is like `binaryIndex` except that it invokes `iteratee` for\n * `value` and each element of `array` to compute their sort ranking. The\n * iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function binaryIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array ? array.length : 0,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsUndef = value === undefined;\n\n while (low < high) {\n var mid = floor((low + high) / 2),\n computed = iteratee(array[mid]),\n isDef = computed !== undefined,\n isReflexive = computed === computed;\n\n if (valIsNaN) {\n var setLow = isReflexive || retHighest;\n } else if (valIsNull) {\n setLow = isReflexive && isDef && (retHighest || computed != null);\n } else if (valIsUndef) {\n setLow = isReflexive && (retHighest || isDef);\n } else if (computed == null) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * A specialized version of `baseCallback` which only supports `this` binding\n * and specifying the number of arguments to provide to `func`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {number} [argCount] The number of arguments to provide to `func`.\n * @returns {Function} Returns the callback.\n */\n function bindCallback(func, thisArg, argCount) {\n if (typeof func != 'function') {\n return identity;\n }\n if (thisArg === undefined) {\n return func;\n }\n switch (argCount) {\n case 1: return function(value) {\n return func.call(thisArg, value);\n };\n case 3: return function(value, index, collection) {\n return func.call(thisArg, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(thisArg, accumulator, value, index, collection);\n };\n case 5: return function(value, other, key, object, source) {\n return func.call(thisArg, value, other, key, object, source);\n };\n }\n return function() {\n return func.apply(thisArg, arguments);\n };\n }\n\n /**\n * Creates a clone of the given array buffer.\n *\n * @private\n * @param {ArrayBuffer} buffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function bufferClone(buffer) {\n return bufferSlice.call(buffer, 0);\n }\n if (!bufferSlice) {\n // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`.\n bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) {\n var byteLength = buffer.byteLength,\n floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0,\n offset = floatLength * FLOAT64_BYTES_PER_ELEMENT,\n result = new ArrayBuffer(byteLength);\n\n if (floatLength) {\n var view = new Float64Array(result, 0, floatLength);\n view.set(new Float64Array(buffer, 0, floatLength));\n }\n if (byteLength != offset) {\n view = new Uint8Array(result, offset);\n view.set(new Uint8Array(buffer, offset));\n }\n return result;\n };\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders) {\n var holdersLength = holders.length,\n argsIndex = -1,\n argsLength = nativeMax(args.length - holdersLength, 0),\n leftIndex = -1,\n leftLength = partials.length,\n result = Array(argsLength + leftLength);\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n while (argsLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array|Object} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders) {\n var holdersIndex = -1,\n holdersLength = holders.length,\n argsIndex = -1,\n argsLength = nativeMax(args.length - holdersLength, 0),\n rightIndex = -1,\n rightLength = partials.length,\n result = Array(argsLength + rightLength);\n\n while (++argsIndex < argsLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * Creates a function that aggregates a collection, creating an accumulator\n * object composed from the results of running each element in the collection\n * through an iteratee.\n *\n * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`,\n * and `_.partition`.\n *\n * @private\n * @param {Function} setter The function to set keys and values of the accumulator object.\n * @param {Function} [initializer] The function to initialize the accumulator object.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee, thisArg) {\n var result = initializer ? initializer() : {};\n iteratee = getCallback(iteratee, thisArg, 3);\n\n if (isArray(collection)) {\n var index = -1,\n length = collection.length;\n\n while (++index < length) {\n var value = collection[index];\n setter(result, value, iteratee(value, index, collection), collection);\n }\n } else {\n baseEach(collection, function(value, key, collection) {\n setter(result, value, iteratee(value, key, collection), collection);\n });\n }\n return result;\n };\n }\n\n /**\n * Creates a function that assigns properties of source object(s) to a given\n * destination object.\n *\n * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return restParam(function(object, sources) {\n var index = -1,\n length = object == null ? 0 : sources.length,\n customizer = length > 2 ? sources[length - 2] : undefined,\n guard = length > 2 ? sources[2] : undefined,\n thisArg = length > 1 ? sources[length - 1] : undefined;\n\n if (typeof customizer == 'function') {\n customizer = bindCallback(customizer, thisArg, 5);\n length -= 2;\n } else {\n customizer = typeof thisArg == 'function' ? thisArg : undefined;\n length -= (customizer ? 1 : 0);\n }\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n var length = collection ? getLength(collection) : 0;\n if (!isLength(length)) {\n return eachFunc(collection, iteratee);\n }\n var index = fromRight ? length : -1,\n iterable = toObject(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for `_.forIn` or `_.forInRight`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var iterable = toObject(object),\n props = keysFunc(object),\n length = props.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length)) {\n var key = props[index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` and invokes it with the `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to bind.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new bound function.\n */\n function createBindWrapper(func, thisArg) {\n var Ctor = createCtorWrapper(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(thisArg, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a `Set` cache object to optimize linear searches of large arrays.\n *\n * @private\n * @param {Array} [values] The values to cache.\n * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n */\n var createCache = !(nativeCreate && Set) ? constant(null) : function(values) {\n return new SetCache(values);\n };\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtorWrapper(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors.\n // See https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new find function.\n */\n function createFind(eachFunc, fromRight) {\n return function(collection, predicate, thisArg) {\n predicate = getCallback(predicate, thisArg, 3);\n if (isArray(collection)) {\n var index = baseFindIndex(collection, predicate, fromRight);\n return index > -1 ? collection[index] : undefined;\n }\n return baseFind(collection, predicate, eachFunc);\n };\n }\n\n /**\n * Creates a function for `_.forEach` or `_.forEachRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\n function createForEach(arrayFunc, eachFunc) {\n return function(collection, iteratee, thisArg) {\n return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n ? arrayFunc(collection, iteratee)\n : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n };\n }\n\n /**\n * Creates a `_.partial` or `_.partialRight` function.\n *\n * @private\n * @param {boolean} flag The partial bit flag.\n * @returns {Function} Returns the new partial function.\n */\n function createPartial(flag) {\n var partialFunc = restParam(function(func, partials) {\n var holders = replaceHolders(partials, partialFunc.placeholder);\n return createWrapper(func, flag, null, partials, holders);\n });\n return partialFunc;\n }\n\n /**\n * Creates a function for `_.reduce` or `_.reduceRight`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over an array.\n * @param {Function} eachFunc The function to iterate over a collection.\n * @returns {Function} Returns the new each function.\n */\n function createReduce(arrayFunc, eachFunc) {\n return function(collection, iteratee, accumulator, thisArg) {\n var initFromArray = arguments.length < 3;\n return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n ? arrayFunc(collection, iteratee, accumulator, initFromArray)\n : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);\n };\n }\n\n /**\n * Creates a function that wraps `func` and invokes it with optional `this`\n * binding of, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & ARY_FLAG,\n isBind = bitmask & BIND_FLAG,\n isBindKey = bitmask & BIND_KEY_FLAG,\n isCurry = bitmask & CURRY_FLAG,\n isCurryBound = bitmask & CURRY_BOUND_FLAG,\n isCurryRight = bitmask & CURRY_RIGHT_FLAG,\n Ctor = isBindKey ? null : createCtorWrapper(func);\n\n function wrapper() {\n // Avoid `arguments` object use disqualifying optimizations by\n // converting it to an array before providing it to other functions.\n var length = arguments.length,\n index = length,\n args = Array(length);\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (partials) {\n args = composeArgs(args, partials, holders);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight);\n }\n if (isCurry || isCurryRight) {\n var placeholder = wrapper.placeholder,\n argsHolders = replaceHolders(args, placeholder);\n\n length -= argsHolders.length;\n if (length < arity) {\n var newArgPos = argPos ? arrayCopy(argPos) : null,\n newArity = nativeMax(arity - length, 0),\n newsHolders = isCurry ? argsHolders : null,\n newHoldersRight = isCurry ? null : argsHolders,\n newPartials = isCurry ? args : null,\n newPartialsRight = isCurry ? null : args;\n\n bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n if (!isCurryBound) {\n bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n }\n var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n result = createHybridWrapper.apply(undefined, newData);\n\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return result;\n }\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n if (argPos) {\n args = reorder(args, argPos);\n }\n if (isAry && ary < args.length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtorWrapper(func);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function that wraps `func` and invokes it with the optional `this`\n * binding of `thisArg` and the `partials` prepended to those provided to\n * the wrapper.\n *\n * @private\n * @param {Function} func The function to partially apply arguments to.\n * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to the new function.\n * @returns {Function} Returns the new bound function.\n */\n function createPartialWrapper(func, bitmask, thisArg, partials) {\n var isBind = bitmask & BIND_FLAG,\n Ctor = createCtorWrapper(func);\n\n function wrapper() {\n // Avoid `arguments` object use disqualifying optimizations by\n // converting it to an array before providing it `func`.\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(argsLength + leftLength);\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to reference.\n * @param {number} bitmask The bitmask of flags.\n * The bitmask may be composed of the following flags:\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n partials = holders = null;\n }\n length -= (holders ? holders.length : 0);\n if (bitmask & PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = null;\n }\n var data = isBindKey ? null : getData(func),\n newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n if (data) {\n mergeData(newData, data);\n bitmask = newData[1];\n arity = newData[9];\n }\n newData[9] = arity == null\n ? (isBindKey ? 0 : func.length)\n : (nativeMax(arity - length, 0) || 0);\n\n if (bitmask == BIND_FLAG) {\n var result = createBindWrapper(newData[0], newData[2]);\n } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n result = createPartialWrapper.apply(undefined, newData);\n } else {\n result = createHybridWrapper.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setter(result, newData);\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing arrays.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var index = -1,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n return false;\n }\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index],\n result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n if (result !== undefined) {\n if (result) {\n continue;\n }\n return false;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (isLoose) {\n if (!arraySome(other, function(othValue) {\n return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n })) {\n return false;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} value The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag) {\n switch (tag) {\n case boolTag:\n case dateTag:\n // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n return +object == +other;\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case numberTag:\n // Treat `NaN` vs. `NaN` as equal.\n return (object != +object)\n ? other != +other\n : object == +other;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings primitives and string\n // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n return object == (other + '');\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparing values.\n * @param {boolean} [isLoose] Specify performing partial comparisons.\n * @param {Array} [stackA] Tracks traversed `value` objects.\n * @param {Array} [stackB] Tracks traversed `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n var objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isLoose) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n var skipCtor = isLoose;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key],\n result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n // Recursively compare objects (susceptible to call stack limits).\n if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n return false;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (!skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Gets the appropriate \"callback\" function. If the `_.callback` method is\n * customized this function returns the custom method, otherwise it returns\n * the `baseCallback` function. If arguments are provided the chosen function\n * is invoked with them and its result is returned.\n *\n * @private\n * @returns {Function} Returns the chosen function or its result.\n */\n function getCallback(func, thisArg, argCount) {\n var result = lodash.callback || callback;\n result = result === callback ? baseCallback : result;\n return argCount ? result(func, thisArg, argCount) : result;\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = func.name,\n array = realNames[result],\n length = array ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n * customized this function returns the custom method, otherwise it returns\n * the `baseIndexOf` function. If arguments are provided the chosen function\n * is invoked with them and its result is returned.\n *\n * @private\n * @returns {Function|number} Returns the chosen function or its result.\n */\n function getIndexOf(collection, target, fromIndex) {\n var result = lodash.indexOf || indexOf;\n result = result === indexOf ? baseIndexOf : result;\n return collection ? result(collection, target, fromIndex) : result;\n }\n\n /**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\n var getLength = baseProperty('length');\n\n /**\n * Gets the propery names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = pairs(object),\n length = result.length;\n\n while (length--) {\n result[length][2] = isStrictComparable(result[length][1]);\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = object == null ? undefined : object[key];\n return isNative(value) ? value : undefined;\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add array properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n var Ctor = object.constructor;\n if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n Ctor = Object;\n }\n return new Ctor;\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return bufferClone(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n var buffer = object.buffer;\n return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n var result = new Ctor(object.source, reFlags.exec(object));\n result.lastIndex = object.lastIndex;\n }\n return result;\n }\n\n /**\n * Invokes the method at `path` on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function invokePath(object, path, args) {\n if (object != null && !isKey(path, object)) {\n path = toPath(path);\n object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n path = last(path);\n }\n var func = object == null ? object : object[path];\n return func == null ? undefined : func.apply(object, args);\n }\n\n /**\n * Checks if `value` is array-like.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n */\n function isArrayLike(value) {\n return value != null && isLength(getLength(value));\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n }\n\n /**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n var other = object[index];\n return value === value ? (value === other) : (other !== other);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n var type = typeof value;\n if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n return true;\n }\n if (isArray(value)) {\n return false;\n }\n var result = !reIsDeepProp.test(value);\n return result || (object != null && value in toObject(object));\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func);\n if (!(funcName in LazyWrapper.prototype)) {\n return false;\n }\n var other = lodash[funcName];\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n */\n function isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers required to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n * augment function arguments, making the order in which they are executed important,\n * preventing the merging of metadata. However, we make an exception for a safe\n * common case where curried functions have `_.ary` and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < ARY_FLAG;\n\n var isCombo =\n (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||\n (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||\n (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = arrayCopy(value);\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * A specialized version of `_.pick` which picks `object` properties specified\n * by `props`.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} props The property names to pick.\n * @returns {Object} Returns the new object.\n */\n function pickByArray(object, props) {\n object = toObject(object);\n\n var index = -1,\n length = props.length,\n result = {};\n\n while (++index < length) {\n var key = props[index];\n if (key in object) {\n result[key] = object[key];\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.pick` which picks `object` properties `predicate`\n * returns truthy for.\n *\n * @private\n * @param {Object} object The source object.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Object} Returns the new object.\n */\n function pickByCallback(object, predicate) {\n var result = {};\n baseForIn(object, function(value, key, object) {\n if (predicate(value, key, object)) {\n result[key] = value;\n }\n });\n return result;\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = arrayCopy(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity function\n * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = (function() {\n var count = 0,\n lastCalled = 0;\n\n return function(key, value) {\n var stamp = now(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return key;\n }\n } else {\n count = 0;\n }\n return baseSetData(key, value);\n };\n }());\n\n /**\n * A fallback implementation of `_.isPlainObject` which checks if `value`\n * is an object created by the `Object` constructor or has a `[[Prototype]]`\n * of `null`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n */\n function shimIsPlainObject(value) {\n var Ctor,\n support = lodash.support;\n\n // Exit early for non `Object` objects.\n if (!(isObjectLike(value) && objToString.call(value) == objectTag) ||\n (!hasOwnProperty.call(value, 'constructor') &&\n (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n return false;\n }\n // IE < 9 iterates inherited properties before own properties. If the first\n // iterated property is an object's own property then there are no inherited\n // enumerable properties.\n var result;\n // In most environments an object's own properties are iterated before\n // its inherited properties. If the last iterated property is an object's\n // own property then there are no inherited enumerable properties.\n baseForIn(value, function(subValue, key) {\n result = key;\n });\n return result === undefined || hasOwnProperty.call(value, result);\n }\n\n /**\n * A fallback implementation of `Object.keys` which creates an array of the\n * own enumerable property names of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function shimKeys(object) {\n var props = keysIn(object),\n propsLength = props.length,\n length = propsLength && object.length;\n\n var allowIndexes = !!length && isLength(length) &&\n (isArray(object) || isArguments(object));\n\n var index = -1,\n result = [];\n\n while (++index < propsLength) {\n var key = props[index];\n if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to an object if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Object} Returns the object.\n */\n function toObject(value) {\n return isObject(value) ? value : Object(value);\n }\n\n /**\n * Converts `value` to property path array if it's not one.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {Array} Returns the property path array.\n */\n function toPath(value) {\n if (isArray(value)) {\n return value;\n }\n var result = [];\n baseToString(value).replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of unique `array` values not included in the other\n * provided arrays using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The arrays of values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.difference([1, 2, 3], [4, 2]);\n * // => [1, 3]\n */\n var difference = restParam(function(array, values) {\n return isArrayLike(array)\n ? baseDifference(array, baseFlatten(values, false, true))\n : [];\n });\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it is used as the offset\n * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`\n * performs a faster binary search.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to search.\n * @param {*} value The value to search for.\n * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n * to perform a binary search on a sorted array.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // using `fromIndex`\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n *\n * // performing a binary search\n * _.indexOf([1, 1, 2, 2], 2, true);\n * // => 2\n */\n function indexOf(array, value, fromIndex) {\n var length = array ? array.length : 0;\n if (!length) {\n return -1;\n }\n if (typeof fromIndex == 'number') {\n fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n } else if (fromIndex) {\n var index = binaryIndex(array, value),\n other = array[index];\n\n if (value === value ? (value === other) : (other !== other)) {\n return index;\n }\n return -1;\n }\n return baseIndexOf(array, value, fromIndex || 0);\n }\n\n /**\n * Creates an array of unique values that are included in all of the provided\n * arrays using [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of shared values.\n * @example\n * _.intersection([1, 2], [4, 2], [2, 1]);\n * // => [2]\n */\n var intersection = restParam(function(arrays) {\n var othLength = arrays.length,\n othIndex = othLength,\n caches = Array(length),\n indexOf = getIndexOf(),\n isCommon = indexOf == baseIndexOf,\n result = [];\n\n while (othIndex--) {\n var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];\n caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;\n }\n var array = arrays[0],\n index = -1,\n length = array ? array.length : 0,\n seen = caches[0];\n\n outer:\n while (++index < length) {\n value = array[index];\n if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {\n var othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(value);\n }\n result.push(value);\n }\n }\n return result;\n });\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array ? array.length : 0;\n return length ? array[length - 1] : undefined;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * The predicate is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias all\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // using the `_.matches` callback shorthand\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.every(users, 'active', false);\n * // => true\n *\n * // using the `_.property` callback shorthand\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, thisArg) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n predicate = null;\n }\n if (typeof predicate != 'function' || thisArg !== undefined) {\n predicate = getCallback(predicate, thisArg, 3);\n }\n return func(collection, predicate);\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n * invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @alias detect\n * @category Collection\n * @param {Array|Object|string} collection The collection to search.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.result(_.find(users, function(chr) {\n * return chr.age < 40;\n * }), 'user');\n * // => 'barney'\n *\n * // using the `_.matches` callback shorthand\n * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n * // => 'pebbles'\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.result(_.find(users, 'active', false), 'user');\n * // => 'fred'\n *\n * // using the `_.property` callback shorthand\n * _.result(_.find(users, 'active'), 'user');\n * // => 'barney'\n */\n var find = createFind(baseEach);\n\n /**\n * Iterates over elements of `collection` invoking `iteratee` for each element.\n * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n * (value, index|key, collection). Iteratee functions may exit iteration early\n * by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n * may be used for object iteration.\n *\n * @static\n * @memberOf _\n * @alias each\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array|Object|string} Returns `collection`.\n * @example\n *\n * _([1, 2]).forEach(function(n) {\n * console.log(n);\n * }).value();\n * // => logs each value from left to right and returns the array\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n * console.log(n, key);\n * });\n * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n */\n var forEach = createForEach(arrayEach, baseEach);\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `methodName` is a function it is\n * invoked for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invoke([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invoke = restParam(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n isProp = isKey(path),\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n var func = isFunc ? path : ((isProp && value != null) ? value[path] : null);\n result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an array of values by running each element in `collection` through\n * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n * arguments: (value, index|key, collection).\n *\n * If a property name is provided for `iteratee` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `iteratee` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n * `sum`, `uniq`, and `words`\n *\n * @static\n * @memberOf _\n * @alias collect\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function timesThree(n) {\n * return n * 3;\n * }\n *\n * _.map([1, 2], timesThree);\n * // => [3, 6]\n *\n * _.map({ 'a': 1, 'b': 2 }, timesThree);\n * // => [3, 6] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // using the `_.property` callback shorthand\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee, thisArg) {\n var func = isArray(collection) ? arrayMap : baseMap;\n iteratee = getCallback(iteratee, thisArg, 3);\n return func(collection, iteratee);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, while the second of which\n * contains elements `predicate` returns falsey for. The predicate is bound\n * to `thisArg` and invoked with three arguments: (value, index|key, collection).\n *\n * If a property name is provided for `predicate` the created `_.property`\n * style callback returns the property value of the given element.\n *\n * If a value is also provided for `thisArg` the created `_.matchesProperty`\n * style callback returns `true` for elements that have a matching property\n * value, else `false`.\n *\n * If an object is provided for `predicate` the created `_.matches` style\n * callback returns `true` for elements that have the properties of the given\n * object, else `false`.\n *\n * @static\n * @memberOf _\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function|Object|string} [predicate=_.identity] The function invoked\n * per iteration.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * _.partition([1, 2, 3], function(n) {\n * return n % 2;\n * });\n * // => [[1, 3], [2]]\n *\n * _.partition([1.2, 2.3, 3.4], function(n) {\n * return this.floor(n) % 2;\n * }, Math);\n * // => [[1.2, 3.4], [2.3]]\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * var mapper = function(array) {\n * return _.pluck(array, 'user');\n * };\n *\n * // using the `_.matches` callback shorthand\n * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);\n * // => [['pebbles'], ['barney', 'fred']]\n *\n * // using the `_.matchesProperty` callback shorthand\n * _.map(_.partition(users, 'active', false), mapper);\n * // => [['barney', 'pebbles'], ['fred']]\n *\n * // using the `_.property` callback shorthand\n * _.map(_.partition(users, 'active'), mapper);\n * // => [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` through `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not provided the first element of `collection` is used as the initial\n * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder`\n *\n * @static\n * @memberOf _\n * @alias foldl, inject\n * @category Collection\n * @param {Array|Object|string} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {*} [thisArg] The `this` binding of `iteratee`.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.reduce([1, 2], function(total, n) {\n * return total + n;\n * });\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {\n * result[key] = n * 3;\n * return result;\n * }, {});\n * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)\n */\n var reduce = createReduce(arrayReduce, baseEach);\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the number of milliseconds that have elapsed since the Unix epoch\n * (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @category Date\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\n var now = nativeNow || function() {\n return new Date().getTime();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and prepends any additional `_.bind` arguments to those provided to the\n * bound function.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind` this method does not set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var greet = function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * };\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // using placeholders\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = restParam(function(func, thisArg, partials) {\n var bitmask = BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, bind.placeholder);\n bitmask |= PARTIAL_FLAG;\n }\n return createWrapper(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it is invoked.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke the function with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // logs 'deferred' after one or more milliseconds\n */\n var defer = restParam(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Creates a function that invokes `func` with `partial` arguments prepended\n * to those provided to the new function. This method is like `_.bind` except\n * it does **not** alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method does not set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * var greet = function(greeting, name) {\n * return greeting + ' ' + name;\n * };\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // using placeholders\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = createPartial(PARTIAL_FLAG);\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.restParam(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function restParam(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n rest = Array(length);\n\n while (++index < length) {\n rest[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, args[0], rest);\n case 2: return func.call(this, args[0], args[1], rest);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = rest;\n return func.apply(this, otherArgs);\n };\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n * otherwise they are assigned by reference. If `customizer` is provided it is\n * invoked to produce the cloned values. If `customizer` returns `undefined`\n * cloning is handled by the method instead. The `customizer` is bound to\n * `thisArg` and invoked with two argument; (value [, index|key, object]).\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n * The enumerable properties of `arguments` objects and objects created by\n * constructors other than `Object` are cloned to plain `Object` objects. An\n * empty object is returned for uncloneable values such as functions, DOM nodes,\n * Maps, Sets, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {Function} [customizer] The function to customize cloning values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {*} Returns the cloned value.\n * @example\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * var shallow = _.clone(users);\n * shallow[0] === users[0];\n * // => true\n *\n * var deep = _.clone(users, true);\n * deep[0] === users[0];\n * // => false\n *\n * // using a customizer callback\n * var el = _.clone(document.body, function(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * });\n *\n * el === document.body\n * // => false\n * el.nodeName\n * // => BODY\n * el.childNodes.length;\n * // => 0\n */\n function clone(value, isDeep, customizer, thisArg) {\n if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {\n isDeep = false;\n }\n else if (typeof isDeep == 'function') {\n thisArg = customizer;\n customizer = isDeep;\n isDeep = false;\n }\n return typeof customizer == 'function'\n ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))\n : baseClone(value, isDeep);\n }\n\n /**\n * Checks if `value` is classified as an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n function isArguments(value) {\n return isObjectLike(value) && isArrayLike(value) && objToString.call(value) == argsTag;\n }\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(function() { return arguments; }());\n * // => false\n */\n var isArray = nativeIsArray || function(value) {\n return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n };\n\n /**\n * Checks if `value` is a DOM element.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */\n function isElement(value) {\n return !!value && value.nodeType === 1 && isObjectLike(value) &&\n (objToString.call(value).indexOf('Element') > -1);\n }\n // Fallback for environments without DOM support.\n if (!support.dom) {\n isElement = function(value) {\n return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);\n };\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent. If `customizer` is provided it is invoked to compare values.\n * If `customizer` returns `undefined` comparisons are handled by the method\n * instead. The `customizer` is bound to `thisArg` and invoked with three\n * arguments: (value, other [, index|key]).\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. Functions and DOM nodes\n * are **not** supported. Provide a customizer function to extend support\n * for comparing other values.\n *\n * @static\n * @memberOf _\n * @alias eq\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize value comparisons.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * object == other;\n * // => false\n *\n * _.isEqual(object, other);\n * // => true\n *\n * // using a customizer callback\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqual(array, other, function(value, other) {\n * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n * return true;\n * }\n * });\n * // => true\n */\n function isEqual(value, other, customizer, thisArg) {\n customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in older versions of Chrome and Safari which return 'function' for regexes\n // and Safari 8 equivalents which return 'object' for typed array constructors.\n return objToString.call(value) == funcTag;\n };\n\n /**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(1);\n * // => false\n */\n function isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (value == null) {\n return false;\n }\n if (objToString.call(value) == funcTag) {\n return reIsNative.test(fnToString.call(value));\n }\n return isObjectLike(value) && reIsHostCtor.test(value);\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n * as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isNumber(8.4);\n * // => true\n *\n * _.isNumber(NaN);\n * // => true\n *\n * _.isNumber('8.4');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * **Note:** This method assumes objects created by the `Object` constructor\n * have no inherited enumerable properties.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {\n if (!(value && objToString.call(value) == objectTag)) {\n return false;\n }\n var valueOf = getNative(value, 'valueOf'),\n objProto = valueOf && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);\n\n return objProto\n ? (value == objProto || getPrototypeOf(value) == objProto)\n : shimIsPlainObject(value);\n };\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n function isTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object. Subsequent sources overwrite property assignments of previous sources.\n * If `customizer` is provided it is invoked to produce the assigned values.\n * The `customizer` is bound to `thisArg` and invoked with five arguments:\n * (objectValue, sourceValue, key, object, source).\n *\n * **Note:** This method mutates `object` and is based on\n * [`Object.assign`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign).\n *\n * @static\n * @memberOf _\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {*} [thisArg] The `this` binding of `customizer`.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n * // => { 'user': 'fred', 'age': 40 }\n *\n * // using a customizer callback\n * var defaults = _.partialRight(_.assign, function(value, other) {\n * return _.isUndefined(value) ? other : value;\n * });\n *\n * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n * // => { 'user': 'barney', 'age': 36 }\n */\n var assign = createAssigner(function(object, source, customizer) {\n return customizer\n ? assignWith(object, source, customizer)\n : baseAssign(object, source);\n });\n\n /**\n * Assigns own enumerable properties of source object(s) to the destination\n * object for all destination properties that resolve to `undefined`. Once a\n * property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n * // => { 'user': 'barney', 'age': 36 }\n */\n var defaults = restParam(function(args) {\n var object = args[0];\n if (object == null) {\n return object;\n }\n args.push(assignDefaults);\n return assign.apply(undefined, args);\n });\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n var keys = !nativeKeys ? shimKeys : function(object) {\n var Ctor = object == null ? null : object.constructor;\n if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n (typeof object != 'function' && isArrayLike(object))) {\n return shimKeys(object);\n }\n return isObject(object) ? nativeKeys(object) : [];\n };\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n if (object == null) {\n return [];\n }\n if (!isObject(object)) {\n object = Object(object);\n }\n var length = object.length;\n length = (length && isLength(length) &&\n (isArray(object) || isArguments(object)) && length) || 0;\n\n var Ctor = object.constructor,\n index = -1,\n isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n result = Array(length),\n skipIndexes = length > 0;\n\n while (++index < length) {\n result[index] = (index + '');\n }\n for (var key in object) {\n if (!(skipIndexes && isIndex(key, length)) &&\n !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable properties of `object` that are not omitted.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {Function|...(string|string[])} [predicate] The function invoked per\n * iteration or property names to omit, specified as individual property\n * names or arrays of property names.\n * @param {*} [thisArg] The `this` binding of `predicate`.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'user': 'fred', 'age': 40 };\n *\n * _.omit(object, 'age');\n * // => { 'user': 'fred' }\n *\n * _.omit(object, _.isNumber);\n * // => { 'user': 'fred' }\n */\n var omit = restParam(function(object, props) {\n if (object == null) {\n return {};\n }\n if (typeof props[0] != 'function') {\n var props = arrayMap(baseFlatten(props), String);\n return pickByArray(object, baseDifference(keysIn(object), props));\n }\n var predicate = bindCallback(props[0], props[1], 3);\n return pickByCallback(object, function(value, key, object) {\n return !predicate(value, key, object);\n });\n });\n\n /**\n * Creates a two dimensional array of the key-value pairs for `object`,\n * e.g. `[[key1, value1], [key2, value2]]`.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the new array of key-value pairs.\n * @example\n *\n * _.pairs({ 'barney': 36, 'fred': 40 });\n * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n */\n function pairs(object) {\n object = toObject(object);\n\n var index = -1,\n props = keys(object),\n length = props.length,\n result = Array(length);\n\n while (++index < length) {\n var key = props[index];\n result[index] = [key, object[key]];\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return baseValues(object, keys(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n *\n * @static\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https:\\/\\/lodash\\.com\\/\\)'\n */\n function escapeRegExp(string) {\n string = baseToString(string);\n return (string && reHasRegExpChars.test(string))\n ? string.replace(reRegExpChars, '\\\\$&')\n : string;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and arguments of the created function. If `func` is a property name the\n * created callback returns the property value for a given element. If `func`\n * is an object the created callback returns `true` for elements that contain\n * the equivalent object properties, otherwise it returns `false`.\n *\n * @static\n * @memberOf _\n * @alias iteratee\n * @category Utility\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // wrap to create custom callback shorthands\n * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {\n * var match = /^(.+?)__([gl]t)(.+)$/.exec(func);\n * if (!match) {\n * return callback(func, thisArg);\n * }\n * return function(object) {\n * return match[2] == 'gt'\n * ? object[match[1]] > match[3]\n * : object[match[1]] < match[3];\n * };\n * });\n *\n * _.filter(users, 'age__gt36');\n * // => [{ 'user': 'fred', 'age': 40 }]\n */\n function callback(func, thisArg, guard) {\n if (guard && isIterateeCall(func, thisArg, guard)) {\n thisArg = null;\n }\n return isObjectLike(func)\n ? matches(func)\n : baseCallback(func, thisArg);\n }\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var getter = _.constant(object);\n *\n * getter() === object;\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * This method returns the first argument provided to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.identity(object) === object;\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /**\n * Creates a function that performs a deep comparison between a given object\n * and `source`, returning `true` if the given object has equivalent property\n * values, else `false`.\n *\n * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n * numbers, `Object` objects, regexes, and strings. Objects are compared by\n * their own, not inherited, enumerable properties. For comparing a single\n * own or inherited property value see `_.matchesProperty`.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, _.matches({ 'age': 40, 'active': false }));\n * // => [{ 'user': 'fred', 'age': 40, 'active': false }]\n */\n function matches(source) {\n return baseMatches(baseClone(source, true));\n }\n\n /**\n * A no-operation function that returns `undefined` regardless of the\n * arguments it receives.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @example\n *\n * var object = { 'user': 'fred' };\n *\n * _.noop(object) === undefined;\n * // => true\n */\n function noop() {\n // No operation performed.\n }\n\n /**\n * Creates a function that returns the property value at `path` on a\n * given object.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': { 'c': 2 } } },\n * { 'a': { 'b': { 'c': 1 } } }\n * ];\n *\n * _.map(objects, _.property('a.b.c'));\n * // => [2, 1]\n *\n * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n * // => [1, 2]\n */\n function property(path) {\n return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n }\n\n /**\n * Generates a unique ID. If `prefix` is provided the ID is appended to it.\n *\n * @static\n * @memberOf _\n * @category Utility\n * @param {string} [prefix] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\n function uniqueId(prefix) {\n var id = ++idCounter;\n return baseToString(prefix) + id;\n }\n\n /*------------------------------------------------------------------------*/\n\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n // Add functions to the `Set` cache.\n SetCache.prototype.push = cachePush;\n\n // Add functions that return wrapped values when chaining.\n lodash.assign = assign;\n lodash.bind = bind;\n lodash.callback = callback;\n lodash.constant = constant;\n lodash.defaults = defaults;\n lodash.defer = defer;\n lodash.difference = difference;\n lodash.forEach = forEach;\n lodash.intersection = intersection;\n lodash.invoke = invoke;\n lodash.keys = keys;\n lodash.keysIn = keysIn;\n lodash.map = map;\n lodash.matches = matches;\n lodash.omit = omit;\n lodash.pairs = pairs;\n lodash.partial = partial;\n lodash.partition = partition;\n lodash.property = property;\n lodash.restParam = restParam;\n lodash.values = values;\n\n // Add aliases.\n lodash.collect = map;\n lodash.each = forEach;\n lodash.extend = assign;\n lodash.iteratee = callback;\n\n /*------------------------------------------------------------------------*/\n\n // Add functions that return unwrapped values when chaining.\n lodash.clone = clone;\n lodash.escapeRegExp = escapeRegExp;\n lodash.every = every;\n lodash.find = find;\n lodash.identity = identity;\n lodash.indexOf = indexOf;\n lodash.isArguments = isArguments;\n lodash.isArray = isArray;\n lodash.isElement = isElement;\n lodash.isEqual = isEqual;\n lodash.isFunction = isFunction;\n lodash.isNative = isNative;\n lodash.isNumber = isNumber;\n lodash.isObject = isObject;\n lodash.isPlainObject = isPlainObject;\n lodash.isString = isString;\n lodash.isTypedArray = isTypedArray;\n lodash.last = last;\n lodash.noop = noop;\n lodash.now = now;\n lodash.reduce = reduce;\n lodash.uniqueId = uniqueId;\n\n // Add aliases.\n lodash.all = every;\n lodash.eq = isEqual;\n lodash.detect = find;\n lodash.foldl = reduce;\n lodash.inject = reduce;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type string\n */\n lodash.VERSION = VERSION;\n\n // Assign default placeholders.\n arrayEach(['bind', 'partial'], function(methodName) {\n lodash[methodName].placeholder = lodash;\n });\n\n /*--------------------------------------------------------------------------*/\n\n // Some AMD build optimizers like r.js check for condition patterns like the following:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose lodash to the global object when an AMD loader is present to avoid\n // errors in cases where lodash is loaded by a script tag and not intended\n // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for\n // more details.\n root._ = lodash;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n define(function() {\n return lodash;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n else if (freeExports && freeModule) {\n // Export for Node.js or RingoJS.\n if (moduleExports) {\n (freeModule.exports = lodash)._ = lodash;\n }\n // Export for Rhino with CommonJS support.\n else {\n freeExports._ = lodash;\n }\n }\n else {\n // Export for a browser or Rhino.\n root._ = lodash;\n }\n}.call(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n/*!\n * EventEmitter2\n * https://github.com/hij1nx/EventEmitter2\n *\n * Copyright (c) 2013 hij1nx\n * Licensed under the MIT license.\n */\n;!function(undefined) {\n\n var isArray = Array.isArray ? Array.isArray : function _isArray(obj) {\n return Object.prototype.toString.call(obj) === \"[object Array]\";\n };\n var defaultMaxListeners = 10;\n\n function init() {\n this._events = {};\n if (this._conf) {\n configure.call(this, this._conf);\n }\n }\n\n function configure(conf) {\n if (conf) {\n\n this._conf = conf;\n\n conf.delimiter && (this.delimiter = conf.delimiter);\n conf.maxListeners && (this._events.maxListeners = conf.maxListeners);\n conf.wildcard && (this.wildcard = conf.wildcard);\n conf.newListener && (this.newListener = conf.newListener);\n\n if (this.wildcard) {\n this.listenerTree = {};\n }\n }\n }\n\n function EventEmitter(conf) {\n this._events = {};\n this.newListener = false;\n configure.call(this, conf);\n }\n\n //\n // Attention, function return type now is array, always !\n // It has zero elements if no any matches found and one or more\n // elements (leafs) if there are matches\n //\n function searchListenerTree(handlers, type, tree, i) {\n if (!tree) {\n return [];\n }\n var listeners=[], leaf, len, branch, xTree, xxTree, isolatedBranch, endReached,\n typeLength = type.length, currentType = type[i], nextType = type[i+1];\n if (i === typeLength && tree._listeners) {\n //\n // If at the end of the event(s) list and the tree has listeners\n // invoke those listeners.\n //\n if (typeof tree._listeners === 'function') {\n handlers && handlers.push(tree._listeners);\n return [tree];\n } else {\n for (leaf = 0, len = tree._listeners.length; leaf < len; leaf++) {\n handlers && handlers.push(tree._listeners[leaf]);\n }\n return [tree];\n }\n }\n\n if ((currentType === '*' || currentType === '**') || tree[currentType]) {\n //\n // If the event emitted is '*' at this part\n // or there is a concrete match at this patch\n //\n if (currentType === '*') {\n for (branch in tree) {\n if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {\n listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+1));\n }\n }\n return listeners;\n } else if(currentType === '**') {\n endReached = (i+1 === typeLength || (i+2 === typeLength && nextType === '*'));\n if(endReached && tree._listeners) {\n // The next element has a _listeners, add it to the handlers.\n listeners = listeners.concat(searchListenerTree(handlers, type, tree, typeLength));\n }\n\n for (branch in tree) {\n if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {\n if(branch === '*' || branch === '**') {\n if(tree[branch]._listeners && !endReached) {\n listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], typeLength));\n }\n listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));\n } else if(branch === nextType) {\n listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+2));\n } else {\n // No match on this one, shift into the tree but not in the type array.\n listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));\n }\n }\n }\n return listeners;\n }\n\n listeners = listeners.concat(searchListenerTree(handlers, type, tree[currentType], i+1));\n }\n\n xTree = tree['*'];\n if (xTree) {\n //\n // If the listener tree will allow any match for this part,\n // then recursively explore all branches of the tree\n //\n searchListenerTree(handlers, type, xTree, i+1);\n }\n\n xxTree = tree['**'];\n if(xxTree) {\n if(i < typeLength) {\n if(xxTree._listeners) {\n // If we have a listener on a '**', it will catch all, so add its handler.\n searchListenerTree(handlers, type, xxTree, typeLength);\n }\n\n // Build arrays of matching next branches and others.\n for(branch in xxTree) {\n if(branch !== '_listeners' && xxTree.hasOwnProperty(branch)) {\n if(branch === nextType) {\n // We know the next element will match, so jump twice.\n searchListenerTree(handlers, type, xxTree[branch], i+2);\n } else if(branch === currentType) {\n // Current node matches, move into the tree.\n searchListenerTree(handlers, type, xxTree[branch], i+1);\n } else {\n isolatedBranch = {};\n isolatedBranch[branch] = xxTree[branch];\n searchListenerTree(handlers, type, { '**': isolatedBranch }, i+1);\n }\n }\n }\n } else if(xxTree._listeners) {\n // We have reached the end and still on a '**'\n searchListenerTree(handlers, type, xxTree, typeLength);\n } else if(xxTree['*'] && xxTree['*']._listeners) {\n searchListenerTree(handlers, type, xxTree['*'], typeLength);\n }\n }\n\n return listeners;\n }\n\n function growListenerTree(type, listener) {\n\n type = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n\n //\n // Looks for two consecutive '**', if so, don't add the event at all.\n //\n for(var i = 0, len = type.length; i+1 < len; i++) {\n if(type[i] === '**' && type[i+1] === '**') {\n return;\n }\n }\n\n var tree = this.listenerTree;\n var name = type.shift();\n\n while (name) {\n\n if (!tree[name]) {\n tree[name] = {};\n }\n\n tree = tree[name];\n\n if (type.length === 0) {\n\n if (!tree._listeners) {\n tree._listeners = listener;\n }\n else if(typeof tree._listeners === 'function') {\n tree._listeners = [tree._listeners, listener];\n }\n else if (isArray(tree._listeners)) {\n\n tree._listeners.push(listener);\n\n if (!tree._listeners.warned) {\n\n var m = defaultMaxListeners;\n\n if (typeof this._events.maxListeners !== 'undefined') {\n m = this._events.maxListeners;\n }\n\n if (m > 0 && tree._listeners.length > m) {\n\n tree._listeners.warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n tree._listeners.length);\n console.trace();\n }\n }\n }\n return true;\n }\n name = type.shift();\n }\n return true;\n }\n\n // By default EventEmitters will print a warning if more than\n // 10 listeners are added to it. This is a useful default which\n // helps finding memory leaks.\n //\n // Obviously not all Emitters should be limited to 10. This function allows\n // that to be increased. Set to zero for unlimited.\n\n EventEmitter.prototype.delimiter = '.';\n\n EventEmitter.prototype.setMaxListeners = function(n) {\n this._events || init.call(this);\n this._events.maxListeners = n;\n if (!this._conf) this._conf = {};\n this._conf.maxListeners = n;\n };\n\n EventEmitter.prototype.event = '';\n\n EventEmitter.prototype.once = function(event, fn) {\n this.many(event, 1, fn);\n return this;\n };\n\n EventEmitter.prototype.many = function(event, ttl, fn) {\n var self = this;\n\n if (typeof fn !== 'function') {\n throw new Error('many only accepts instances of Function');\n }\n\n function listener() {\n if (--ttl === 0) {\n self.off(event, listener);\n }\n fn.apply(this, arguments);\n }\n\n listener._origin = fn;\n\n this.on(event, listener);\n\n return self;\n };\n\n EventEmitter.prototype.emit = function() {\n\n this._events || init.call(this);\n\n var type = arguments[0];\n\n if (type === 'newListener' && !this.newListener) {\n if (!this._events.newListener) { return false; }\n }\n\n // Loop through the *_all* functions and invoke them.\n if (this._all) {\n var l = arguments.length;\n var args = new Array(l - 1);\n for (var i = 1; i < l; i++) args[i - 1] = arguments[i];\n for (i = 0, l = this._all.length; i < l; i++) {\n this.event = type;\n this._all[i].apply(this, args);\n }\n }\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n\n if (!this._all &&\n !this._events.error &&\n !(this.wildcard && this.listenerTree.error)) {\n\n if (arguments[1] instanceof Error) {\n throw arguments[1]; // Unhandled 'error' event\n } else {\n throw new Error(\"Uncaught, unspecified 'error' event.\");\n }\n return false;\n }\n }\n\n var handler;\n\n if(this.wildcard) {\n handler = [];\n var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n searchListenerTree.call(this, handler, ns, this.listenerTree, 0);\n }\n else {\n handler = this._events[type];\n }\n\n if (typeof handler === 'function') {\n this.event = type;\n if (arguments.length === 1) {\n handler.call(this);\n }\n else if (arguments.length > 1)\n switch (arguments.length) {\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n var l = arguments.length;\n var args = new Array(l - 1);\n for (var i = 1; i < l; i++) args[i - 1] = arguments[i];\n handler.apply(this, args);\n }\n return true;\n }\n else if (handler) {\n var l = arguments.length;\n var args = new Array(l - 1);\n for (var i = 1; i < l; i++) args[i - 1] = arguments[i];\n\n var listeners = handler.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n this.event = type;\n listeners[i].apply(this, args);\n }\n return (listeners.length > 0) || !!this._all;\n }\n else {\n return !!this._all;\n }\n\n };\n\n EventEmitter.prototype.on = function(type, listener) {\n\n if (typeof type === 'function') {\n this.onAny(type);\n return this;\n }\n\n if (typeof listener !== 'function') {\n throw new Error('on only accepts instances of Function');\n }\n this._events || init.call(this);\n\n // To avoid recursion in the case that type == \"newListeners\"! Before\n // adding it to the listeners, first emit \"newListeners\".\n this.emit('newListener', type, listener);\n\n if(this.wildcard) {\n growListenerTree.call(this, type, listener);\n return this;\n }\n\n if (!this._events[type]) {\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n }\n else if(typeof this._events[type] === 'function') {\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n }\n else if (isArray(this._events[type])) {\n // If we've already got an array, just append.\n this._events[type].push(listener);\n\n // Check for listener leak\n if (!this._events[type].warned) {\n\n var m = defaultMaxListeners;\n\n if (typeof this._events.maxListeners !== 'undefined') {\n m = this._events.maxListeners;\n }\n\n if (m > 0 && this._events[type].length > m) {\n\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n console.trace();\n }\n }\n }\n return this;\n };\n\n EventEmitter.prototype.onAny = function(fn) {\n\n if (typeof fn !== 'function') {\n throw new Error('onAny only accepts instances of Function');\n }\n\n if(!this._all) {\n this._all = [];\n }\n\n // Add the function to the event listener collection.\n this._all.push(fn);\n return this;\n };\n\n EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n EventEmitter.prototype.off = function(type, listener) {\n if (typeof listener !== 'function') {\n throw new Error('removeListener only takes instances of Function');\n }\n\n var handlers,leafs=[];\n\n if(this.wildcard) {\n var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);\n }\n else {\n // does not use listeners(), so no side effect of creating _events[type]\n if (!this._events[type]) return this;\n handlers = this._events[type];\n leafs.push({_listeners:handlers});\n }\n\n for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {\n var leaf = leafs[iLeaf];\n handlers = leaf._listeners;\n if (isArray(handlers)) {\n\n var position = -1;\n\n for (var i = 0, length = handlers.length; i < length; i++) {\n if (handlers[i] === listener ||\n (handlers[i].listener && handlers[i].listener === listener) ||\n (handlers[i]._origin && handlers[i]._origin === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0) {\n continue;\n }\n\n if(this.wildcard) {\n leaf._listeners.splice(position, 1);\n }\n else {\n this._events[type].splice(position, 1);\n }\n\n if (handlers.length === 0) {\n if(this.wildcard) {\n delete leaf._listeners;\n }\n else {\n delete this._events[type];\n }\n }\n return this;\n }\n else if (handlers === listener ||\n (handlers.listener && handlers.listener === listener) ||\n (handlers._origin && handlers._origin === listener)) {\n if(this.wildcard) {\n delete leaf._listeners;\n }\n else {\n delete this._events[type];\n }\n }\n }\n\n return this;\n };\n\n EventEmitter.prototype.offAny = function(fn) {\n var i = 0, l = 0, fns;\n if (fn && this._all && this._all.length > 0) {\n fns = this._all;\n for(i = 0, l = fns.length; i < l; i++) {\n if(fn === fns[i]) {\n fns.splice(i, 1);\n return this;\n }\n }\n } else {\n this._all = [];\n }\n return this;\n };\n\n EventEmitter.prototype.removeListener = EventEmitter.prototype.off;\n\n EventEmitter.prototype.removeAllListeners = function(type) {\n if (arguments.length === 0) {\n !this._events || init.call(this);\n return this;\n }\n\n if(this.wildcard) {\n var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n var leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);\n\n for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {\n var leaf = leafs[iLeaf];\n leaf._listeners = null;\n }\n }\n else {\n if (!this._events[type]) return this;\n this._events[type] = null;\n }\n return this;\n };\n\n EventEmitter.prototype.listeners = function(type) {\n if(this.wildcard) {\n var handlers = [];\n var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\n searchListenerTree.call(this, handlers, ns, this.listenerTree, 0);\n return handlers;\n }\n\n this._events || init.call(this);\n\n if (!this._events[type]) this._events[type] = [];\n if (!isArray(this._events[type])) {\n this._events[type] = [this._events[type]];\n }\n return this._events[type];\n };\n\n EventEmitter.prototype.listenersAny = function() {\n\n if(this._all) {\n return this._all;\n }\n else {\n return [];\n }\n\n };\n\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(function() {\n return EventEmitter;\n });\n } else if (typeof exports === 'object') {\n // CommonJS\n exports.EventEmitter2 = EventEmitter;\n }\n else {\n // Browser global.\n window.EventEmitter2 = EventEmitter;\n }\n}();\n\n},{}],3:[function(_dereq_,module,exports){\nvar diff = _dereq_('fast-diff');\nvar is = _dereq_('./is');\nvar op = _dereq_('./op');\n\n\nvar NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()\n\n\nvar Delta = function (ops) {\n // Assume we are given a well formed ops\n if (is.array(ops)) {\n this.ops = ops;\n } else if (is.object(ops) && is.array(ops.ops)) {\n this.ops = ops.ops;\n } else {\n this.ops = [];\n }\n};\n\n\nDelta.prototype.insert = function (text, attributes) {\n var newOp = {};\n if (text.length === 0) return this;\n newOp.insert = text;\n if (is.object(attributes) && Object.keys(attributes).length > 0) newOp.attributes = attributes;\n return this.push(newOp);\n};\n\nDelta.prototype['delete'] = function (length) {\n if (length <= 0) return this;\n return this.push({ 'delete': length });\n};\n\nDelta.prototype.retain = function (length, attributes) {\n if (length <= 0) return this;\n var newOp = { retain: length };\n if (is.object(attributes) && Object.keys(attributes).length > 0) newOp.attributes = attributes;\n return this.push(newOp);\n};\n\nDelta.prototype.push = function (newOp) {\n var index = this.ops.length;\n var lastOp = this.ops[index - 1];\n newOp = op.clone(newOp);\n if (is.object(lastOp)) {\n if (is.number(newOp['delete']) && is.number(lastOp['delete'])) {\n this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] };\n return this;\n }\n // Since it does not matter if we insert before or after deleting at the same index,\n // always prefer to insert first\n if (is.number(lastOp['delete']) && newOp.insert != null) {\n index -= 1;\n lastOp = this.ops[index - 1];\n if (!is.object(lastOp)) {\n this.ops.unshift(newOp);\n return this;\n }\n }\n if (is.equal(newOp.attributes, lastOp.attributes)) {\n if (is.string(newOp.insert) && is.string(lastOp.insert)) {\n this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n if (is.object(newOp.attributes)) this.ops[index - 1].attributes = newOp.attributes\n return this;\n } else if (is.number(newOp.retain) && is.number(lastOp.retain)) {\n this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n if (is.object(newOp.attributes)) this.ops[index - 1].attributes = newOp.attributes\n return this;\n }\n }\n }\n if (index === this.ops.length) {\n this.ops.push(newOp);\n } else {\n this.ops.splice(index, 0, newOp);\n }\n return this;\n};\n\nDelta.prototype.chop = function () {\n var lastOp = this.ops[this.ops.length - 1];\n if (lastOp && lastOp.retain && !lastOp.attributes) {\n this.ops.pop();\n }\n return this;\n};\n\nDelta.prototype.length = function () {\n return this.ops.reduce(function (length, elem) {\n return length + op.length(elem);\n }, 0);\n};\n\nDelta.prototype.slice = function (start, end) {\n start = start || 0;\n if (!is.number(end)) end = Infinity;\n var delta = new Delta();\n var iter = op.iterator(this.ops);\n var index = 0;\n while (index < end && iter.hasNext()) {\n var nextOp;\n if (index < start) {\n nextOp = iter.next(start - index);\n } else {\n nextOp = iter.next(end - index);\n delta.push(nextOp);\n }\n index += op.length(nextOp);\n }\n return delta;\n};\n\n\nDelta.prototype.compose = function (other) {\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n var delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else if (thisIter.peekType() === 'delete') {\n delta.push(thisIter.next());\n } else {\n var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n var thisOp = thisIter.next(length);\n var otherOp = otherIter.next(length);\n if (is.number(otherOp.retain)) {\n var newOp = {};\n if (is.number(thisOp.retain)) {\n newOp.retain = length;\n } else {\n newOp.insert = thisOp.insert;\n }\n // Preserve null when composing with a retain, otherwise remove it for inserts\n var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, is.number(thisOp.retain));\n if (attributes) newOp.attributes = attributes;\n delta.push(newOp);\n // Other op should be delete, we could be an insert or retain\n // Insert + delete cancels out\n } else if (is.number(otherOp['delete']) && is.number(thisOp.retain)) {\n delta.push(otherOp);\n }\n }\n }\n return delta.chop();\n};\n\nDelta.prototype.concat = function (other) {\n var delta = this.slice();\n if (other.ops.length > 0) {\n delta.push(other.ops[0]);\n delta.ops = delta.ops.concat(other.ops.slice(1));\n }\n return delta;\n};\n\nDelta.prototype.diff = function (other) {\n var delta = new Delta();\n if (this.ops === other.ops) {\n return delta;\n }\n var strings = [this.ops, other.ops].map(function (ops) {\n return ops.map(function (op) {\n if (op.insert != null) {\n return is.string(op.insert) ? op.insert : NULL_CHARACTER;\n }\n var prep = (ops === other.ops) ? 'on' : 'with';\n throw new Error('diff() called ' + prep + ' non-document');\n }).join('');\n });\n var diffResult = diff(strings[0], strings[1]);\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n diffResult.forEach(function (component) {\n var length = component[1].length;\n while (length > 0) {\n var opLength = 0;\n switch (component[0]) {\n case diff.INSERT:\n opLength = Math.min(otherIter.peekLength(), length);\n delta.push(otherIter.next(opLength));\n break;\n case diff.DELETE:\n opLength = Math.min(length, thisIter.peekLength());\n thisIter.next(opLength);\n delta['delete'](opLength);\n break;\n case diff.EQUAL:\n opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length);\n var thisOp = thisIter.next(opLength);\n var otherOp = otherIter.next(opLength);\n if (is.equal(thisOp.insert, otherOp.insert)) {\n delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes));\n } else {\n delta.push(otherOp)['delete'](opLength);\n }\n break;\n }\n length -= opLength;\n }\n });\n return delta.chop();\n};\n\nDelta.prototype.transform = function (other, priority) {\n priority = !!priority;\n if (is.number(other)) {\n return this.transformPosition(other, priority);\n }\n var thisIter = op.iterator(this.ops);\n var otherIter = op.iterator(other.ops);\n var delta = new Delta();\n while (thisIter.hasNext() || otherIter.hasNext()) {\n if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) {\n delta.retain(op.length(thisIter.next()));\n } else if (otherIter.peekType() === 'insert') {\n delta.push(otherIter.next());\n } else {\n var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n var thisOp = thisIter.next(length);\n var otherOp = otherIter.next(length);\n if (thisOp['delete']) {\n // Our delete either makes their delete redundant or removes their retain\n continue;\n } else if (otherOp['delete']) {\n delta.push(otherOp);\n } else {\n // We retain either their retain or insert\n delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority));\n }\n }\n }\n return delta.chop();\n};\n\nDelta.prototype.transformPosition = function (index, priority) {\n priority = !!priority;\n var thisIter = op.iterator(this.ops);\n var offset = 0;\n while (thisIter.hasNext() && offset <= index) {\n var length = thisIter.peekLength();\n var nextType = thisIter.peekType();\n thisIter.next();\n if (nextType === 'delete') {\n index -= Math.min(length, index - offset);\n continue;\n } else if (nextType === 'insert' && (offset < index || !priority)) {\n index += length;\n }\n offset += length;\n }\n return index;\n};\n\n\nmodule.exports = Delta;\n\n},{\"./is\":4,\"./op\":5,\"fast-diff\":6}],4:[function(_dereq_,module,exports){\nmodule.exports = {\n equal: function (a, b) {\n if (a === b) return true;\n if (a == null && b == null) return true;\n if (a == null || b == null) return false;\n if (!this.object(a) || !this.object(b)) return false;\n if (Object.keys(a).length != Object.keys(b).length) return false;\n for(var key in a) {\n // Only compare one level deep\n if (a[key] !== b[key]) return false;\n }\n return true;\n },\n\n array: function (value) {\n return Array.isArray(value);\n },\n\n number: function (value) {\n if (typeof value === 'number') return true;\n if (typeof value === 'object' && Object.prototype.toString.call(value) === '[object Number]') return true;\n return false;\n },\n\n object: function (value) {\n if (!value) return false;\n return (typeof value === 'function' || typeof value === 'object');\n },\n\n string: function (value) {\n if (typeof value === 'string') return true;\n if (typeof value === 'object' && Object.prototype.toString.call(value) === '[object String]') return true;\n return false;\n }\n};\n\n},{}],5:[function(_dereq_,module,exports){\nvar is = _dereq_('./is');\n\n\nvar lib = {\n attributes: {\n clone: function (attributes, keepNull) {\n if (!is.object(attributes)) return {};\n return Object.keys(attributes).reduce(function (memo, key) {\n if (attributes[key] !== undefined && (attributes[key] !== null || keepNull)) {\n memo[key] = attributes[key];\n }\n return memo;\n }, {});\n },\n\n compose: function (a, b, keepNull) {\n if (!is.object(a)) a = {};\n if (!is.object(b)) b = {};\n var attributes = this.clone(b, keepNull);\n for (var key in a) {\n if (a[key] !== undefined && b[key] === undefined) {\n attributes[key] = a[key];\n }\n }\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n },\n\n diff: function(a, b) {\n if (!is.object(a)) a = {};\n if (!is.object(b)) b = {};\n var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) {\n if (a[key] !== b[key]) {\n attributes[key] = b[key] === undefined ? null : b[key];\n }\n return attributes;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n },\n\n transform: function (a, b, priority) {\n if (!is.object(a)) return b;\n if (!is.object(b)) return undefined;\n if (!priority) return b; // b simply overwrites us without priority\n var attributes = Object.keys(b).reduce(function (attributes, key) {\n if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value\n return attributes;\n }, {});\n return Object.keys(attributes).length > 0 ? attributes : undefined;\n }\n },\n\n clone: function (op) {\n var newOp = this.attributes.clone(op);\n if (is.object(newOp.attributes)) {\n newOp.attributes = this.attributes.clone(newOp.attributes, true);\n }\n return newOp;\n },\n\n iterator: function (ops) {\n return new Iterator(ops);\n },\n\n length: function (op) {\n if (is.number(op['delete'])) {\n return op['delete'];\n } else if (is.number(op.retain)) {\n return op.retain;\n } else {\n return is.string(op.insert) ? op.insert.length : 1;\n }\n }\n};\n\n\nfunction Iterator(ops) {\n this.ops = ops;\n this.index = 0;\n this.offset = 0;\n};\n\nIterator.prototype.hasNext = function () {\n return this.peekLength() < Infinity;\n};\n\nIterator.prototype.next = function (length) {\n if (!length) length = Infinity;\n var nextOp = this.ops[this.index];\n if (nextOp) {\n var offset = this.offset;\n var opLength = lib.length(nextOp)\n if (length >= opLength - offset) {\n length = opLength - offset;\n this.index += 1;\n this.offset = 0;\n } else {\n this.offset += length;\n }\n if (is.number(nextOp['delete'])) {\n return { 'delete': length };\n } else {\n var retOp = {};\n if (nextOp.attributes) {\n retOp.attributes = nextOp.attributes;\n }\n if (is.number(nextOp.retain)) {\n retOp.retain = length;\n } else if (is.string(nextOp.insert)) {\n retOp.insert = nextOp.insert.substr(offset, length);\n } else {\n // offset should === 0, length should === 1\n retOp.insert = nextOp.insert;\n }\n return retOp;\n }\n } else {\n return { retain: Infinity };\n }\n};\n\nIterator.prototype.peekLength = function () {\n if (this.ops[this.index]) {\n // Should never return 0 if our index is being managed correctly\n return lib.length(this.ops[this.index]) - this.offset;\n } else {\n return Infinity;\n }\n};\n\nIterator.prototype.peekType = function () {\n if (this.ops[this.index]) {\n if (is.number(this.ops[this.index]['delete'])) {\n return 'delete';\n } else if (is.number(this.ops[this.index].retain)) {\n return 'retain';\n } else {\n return 'insert';\n }\n }\n return 'retain';\n};\n\n\nmodule.exports = lib;\n\n},{\"./is\":4}],6:[function(_dereq_,module,exports){\n/**\n * This library modifies the diff-patch-match library by Neil Fraser\n * by removing the patch and match functionality and certain advanced\n * options in the diff function. The original license is as follows:\n *\n * ===\n *\n * Diff Match and Patch\n *\n * Copyright 2006 Google Inc.\n * http://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\nvar DIFF_DELETE = -1;\nvar DIFF_INSERT = 1;\nvar DIFF_EQUAL = 0;\n\n\n/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_main(text1, text2) {\n // Check for equality (speedup).\n if (text1 == text2) {\n if (text1) {\n return [[DIFF_EQUAL, text1]];\n }\n return [];\n }\n\n // Trim off common prefix (speedup).\n var commonlength = diff_commonPrefix(text1, text2);\n var commonprefix = text1.substring(0, commonlength);\n text1 = text1.substring(commonlength);\n text2 = text2.substring(commonlength);\n\n // Trim off common suffix (speedup).\n commonlength = diff_commonSuffix(text1, text2);\n var commonsuffix = text1.substring(text1.length - commonlength);\n text1 = text1.substring(0, text1.length - commonlength);\n text2 = text2.substring(0, text2.length - commonlength);\n\n // Compute the diff on the middle block.\n var diffs = diff_compute_(text1, text2);\n\n // Restore the prefix and suffix.\n if (commonprefix) {\n diffs.unshift([DIFF_EQUAL, commonprefix]);\n }\n if (commonsuffix) {\n diffs.push([DIFF_EQUAL, commonsuffix]);\n }\n diff_cleanupMerge(diffs);\n return diffs;\n};\n\n\n/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_compute_(text1, text2) {\n var diffs;\n\n if (!text1) {\n // Just add some text (speedup).\n return [[DIFF_INSERT, text2]];\n }\n\n if (!text2) {\n // Just delete some text (speedup).\n return [[DIFF_DELETE, text1]];\n }\n\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n var i = longtext.indexOf(shorttext);\n if (i != -1) {\n // Shorter text is inside the longer text (speedup).\n diffs = [[DIFF_INSERT, longtext.substring(0, i)],\n [DIFF_EQUAL, shorttext],\n [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n // Swap insertions for deletions if diff is reversed.\n if (text1.length > text2.length) {\n diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n }\n return diffs;\n }\n\n if (shorttext.length == 1) {\n // Single character string.\n // After the previous speedup, the character can't be an equality.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n }\n\n // Check to see if the problem can be split in two.\n var hm = diff_halfMatch_(text1, text2);\n if (hm) {\n // A half-match was found, sort out the return data.\n var text1_a = hm[0];\n var text1_b = hm[1];\n var text2_a = hm[2];\n var text2_b = hm[3];\n var mid_common = hm[4];\n // Send both pairs off for separate processing.\n var diffs_a = diff_main(text1_a, text2_a);\n var diffs_b = diff_main(text1_b, text2_b);\n // Merge the results.\n return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n }\n\n return diff_bisect_(text1, text2);\n};\n\n\n/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @return {Array} Array of diff tuples.\n * @private\n */\nfunction diff_bisect_(text1, text2) {\n // Cache the text lengths to prevent multiple calls.\n var text1_length = text1.length;\n var text2_length = text2.length;\n var max_d = Math.ceil((text1_length + text2_length) / 2);\n var v_offset = max_d;\n var v_length = 2 * max_d;\n var v1 = new Array(v_length);\n var v2 = new Array(v_length);\n // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n // integers and undefined.\n for (var x = 0; x < v_length; x++) {\n v1[x] = -1;\n v2[x] = -1;\n }\n v1[v_offset + 1] = 0;\n v2[v_offset + 1] = 0;\n var delta = text1_length - text2_length;\n // If the total number of characters is odd, then the front path will collide\n // with the reverse path.\n var front = (delta % 2 != 0);\n // Offsets for start and end of k loop.\n // Prevents mapping of space beyond the grid.\n var k1start = 0;\n var k1end = 0;\n var k2start = 0;\n var k2end = 0;\n for (var d = 0; d < max_d; d++) {\n // Walk the front path one step.\n for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n var k1_offset = v_offset + k1;\n var x1;\n if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n x1 = v1[k1_offset + 1];\n } else {\n x1 = v1[k1_offset - 1] + 1;\n }\n var y1 = x1 - k1;\n while (x1 < text1_length && y1 < text2_length &&\n text1.charAt(x1) == text2.charAt(y1)) {\n x1++;\n y1++;\n }\n v1[k1_offset] = x1;\n if (x1 > text1_length) {\n // Ran off the right of the graph.\n k1end += 2;\n } else if (y1 > text2_length) {\n // Ran off the bottom of the graph.\n k1start += 2;\n } else if (front) {\n var k2_offset = v_offset + delta - k1;\n if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n // Mirror x2 onto top-left coordinate system.\n var x2 = text1_length - v2[k2_offset];\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n\n // Walk the reverse path one step.\n for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n var k2_offset = v_offset + k2;\n var x2;\n if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n x2 = v2[k2_offset + 1];\n } else {\n x2 = v2[k2_offset - 1] + 1;\n }\n var y2 = x2 - k2;\n while (x2 < text1_length && y2 < text2_length &&\n text1.charAt(text1_length - x2 - 1) ==\n text2.charAt(text2_length - y2 - 1)) {\n x2++;\n y2++;\n }\n v2[k2_offset] = x2;\n if (x2 > text1_length) {\n // Ran off the left of the graph.\n k2end += 2;\n } else if (y2 > text2_length) {\n // Ran off the top of the graph.\n k2start += 2;\n } else if (!front) {\n var k1_offset = v_offset + delta - k2;\n if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n var x1 = v1[k1_offset];\n var y1 = v_offset + x1 - k1_offset;\n // Mirror x2 onto top-left coordinate system.\n x2 = text1_length - x2;\n if (x1 >= x2) {\n // Overlap detected.\n return diff_bisectSplit_(text1, text2, x1, y1);\n }\n }\n }\n }\n }\n // Diff took too long and hit the deadline or\n // number of diffs equals number of characters, no commonality at all.\n return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n};\n\n\n/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @return {Array} Array of diff tuples.\n */\nfunction diff_bisectSplit_(text1, text2, x, y) {\n var text1a = text1.substring(0, x);\n var text2a = text2.substring(0, y);\n var text1b = text1.substring(x);\n var text2b = text2.substring(y);\n\n // Compute both diffs serially.\n var diffs = diff_main(text1a, text2a);\n var diffsb = diff_main(text1b, text2b);\n\n return diffs.concat(diffsb);\n};\n\n\n/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\nfunction diff_commonPrefix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerstart = 0;\n while (pointermin < pointermid) {\n if (text1.substring(pointerstart, pointermid) ==\n text2.substring(pointerstart, pointermid)) {\n pointermin = pointermid;\n pointerstart = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\nfunction diff_commonSuffix(text1, text2) {\n // Quick check for common null cases.\n if (!text1 || !text2 ||\n text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n return 0;\n }\n // Binary search.\n // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n var pointermin = 0;\n var pointermax = Math.min(text1.length, text2.length);\n var pointermid = pointermax;\n var pointerend = 0;\n while (pointermin < pointermid) {\n if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n pointermin = pointermid;\n pointerend = pointermin;\n } else {\n pointermax = pointermid;\n }\n pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n }\n return pointermid;\n};\n\n\n/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n */\nfunction diff_halfMatch_(text1, text2) {\n var longtext = text1.length > text2.length ? text1 : text2;\n var shorttext = text1.length > text2.length ? text2 : text1;\n if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n return null; // Pointless.\n }\n\n /**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n function diff_halfMatchI_(longtext, shorttext, i) {\n // Start with a 1/4 length substring at position i as a seed.\n var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n var j = -1;\n var best_common = '';\n var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n var prefixLength = diff_commonPrefix(longtext.substring(i),\n shorttext.substring(j));\n var suffixLength = diff_commonSuffix(longtext.substring(0, i),\n shorttext.substring(0, j));\n if (best_common.length < suffixLength + prefixLength) {\n best_common = shorttext.substring(j - suffixLength, j) +\n shorttext.substring(j, j + prefixLength);\n best_longtext_a = longtext.substring(0, i - suffixLength);\n best_longtext_b = longtext.substring(i + prefixLength);\n best_shorttext_a = shorttext.substring(0, j - suffixLength);\n best_shorttext_b = shorttext.substring(j + prefixLength);\n }\n }\n if (best_common.length * 2 >= longtext.length) {\n return [best_longtext_a, best_longtext_b,\n best_shorttext_a, best_shorttext_b, best_common];\n } else {\n return null;\n }\n }\n\n // First check if the second quarter is the seed for a half-match.\n var hm1 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 4));\n // Check again based on the third quarter.\n var hm2 = diff_halfMatchI_(longtext, shorttext,\n Math.ceil(longtext.length / 2));\n var hm;\n if (!hm1 && !hm2) {\n return null;\n } else if (!hm2) {\n hm = hm1;\n } else if (!hm1) {\n hm = hm2;\n } else {\n // Both matched. Select the longest.\n hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n }\n\n // A half-match was found, sort out the return data.\n var text1_a, text1_b, text2_a, text2_b;\n if (text1.length > text2.length) {\n text1_a = hm[0];\n text1_b = hm[1];\n text2_a = hm[2];\n text2_b = hm[3];\n } else {\n text2_a = hm[0];\n text2_b = hm[1];\n text1_a = hm[2];\n text1_b = hm[3];\n }\n var mid_common = hm[4];\n return [text1_a, text1_b, text2_a, text2_b, mid_common];\n};\n\n\n/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {Array} diffs Array of diff tuples.\n */\nfunction diff_cleanupMerge(diffs) {\n diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.\n var pointer = 0;\n var count_delete = 0;\n var count_insert = 0;\n var text_delete = '';\n var text_insert = '';\n var commonlength;\n while (pointer < diffs.length) {\n switch (diffs[pointer][0]) {\n case DIFF_INSERT:\n count_insert++;\n text_insert += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_DELETE:\n count_delete++;\n text_delete += diffs[pointer][1];\n pointer++;\n break;\n case DIFF_EQUAL:\n // Upon reaching an equality, check for prior redundancies.\n if (count_delete + count_insert > 1) {\n if (count_delete !== 0 && count_insert !== 0) {\n // Factor out any common prefixies.\n commonlength = diff_commonPrefix(text_insert, text_delete);\n if (commonlength !== 0) {\n if ((pointer - count_delete - count_insert) > 0 &&\n diffs[pointer - count_delete - count_insert - 1][0] ==\n DIFF_EQUAL) {\n diffs[pointer - count_delete - count_insert - 1][1] +=\n text_insert.substring(0, commonlength);\n } else {\n diffs.splice(0, 0, [DIFF_EQUAL,\n text_insert.substring(0, commonlength)]);\n pointer++;\n }\n text_insert = text_insert.substring(commonlength);\n text_delete = text_delete.substring(commonlength);\n }\n // Factor out any common suffixies.\n commonlength = diff_commonSuffix(text_insert, text_delete);\n if (commonlength !== 0) {\n diffs[pointer][1] = text_insert.substring(text_insert.length -\n commonlength) + diffs[pointer][1];\n text_insert = text_insert.substring(0, text_insert.length -\n commonlength);\n text_delete = text_delete.substring(0, text_delete.length -\n commonlength);\n }\n }\n // Delete the offending records and add the merged ones.\n if (count_delete === 0) {\n diffs.splice(pointer - count_insert,\n count_delete + count_insert, [DIFF_INSERT, text_insert]);\n } else if (count_insert === 0) {\n diffs.splice(pointer - count_delete,\n count_delete + count_insert, [DIFF_DELETE, text_delete]);\n } else {\n diffs.splice(pointer - count_delete - count_insert,\n count_delete + count_insert, [DIFF_DELETE, text_delete],\n [DIFF_INSERT, text_insert]);\n }\n pointer = pointer - count_delete - count_insert +\n (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\n } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n // Merge this equality with the previous one.\n diffs[pointer - 1][1] += diffs[pointer][1];\n diffs.splice(pointer, 1);\n } else {\n pointer++;\n }\n count_insert = 0;\n count_delete = 0;\n text_delete = '';\n text_insert = '';\n break;\n }\n }\n if (diffs[diffs.length - 1][1] === '') {\n diffs.pop(); // Remove the dummy entry at the end.\n }\n\n // Second pass: look for single edits surrounded on both sides by equalities\n // which can be shifted sideways to eliminate an equality.\n // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n var changes = false;\n pointer = 1;\n // Intentionally ignore the first and last element (don't need checking).\n while (pointer < diffs.length - 1) {\n if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n diffs[pointer + 1][0] == DIFF_EQUAL) {\n // This is a single edit surrounded by equalities.\n if (diffs[pointer][1].substring(diffs[pointer][1].length -\n diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n // Shift the edit over the previous equality.\n diffs[pointer][1] = diffs[pointer - 1][1] +\n diffs[pointer][1].substring(0, diffs[pointer][1].length -\n diffs[pointer - 1][1].length);\n diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n diffs.splice(pointer - 1, 1);\n changes = true;\n } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n diffs[pointer + 1][1]) {\n // Shift the edit over the next equality.\n diffs[pointer - 1][1] += diffs[pointer + 1][1];\n diffs[pointer][1] =\n diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n diffs[pointer + 1][1];\n diffs.splice(pointer + 1, 1);\n changes = true;\n }\n }\n pointer++;\n }\n // If shifts were made, the diff needs reordering and another shift sweep.\n if (changes) {\n diff_cleanupMerge(diffs);\n }\n};\n\n\nvar diff = diff_main;\ndiff.INSERT = DIFF_INSERT;\ndiff.DELETE = DIFF_DELETE;\ndiff.EQUAL = DIFF_EQUAL;\n\n\nmodule.exports = diff;\n\n},{}],7:[function(_dereq_,module,exports){\nmodule.exports={\"version\":\"0.20.1\"}\n},{}],8:[function(_dereq_,module,exports){\nvar Delta, Document, Format, Line, LinkedList, Normalizer, _, dom;\n\n_ = _dereq_('lodash');\n\nDelta = _dereq_('rich-text/lib/delta');\n\ndom = _dereq_('../lib/dom');\n\nFormat = _dereq_('./format');\n\nLine = _dereq_('./line');\n\nLinkedList = _dereq_('../lib/linked-list');\n\nNormalizer = _dereq_('./normalizer');\n\nDocument = (function() {\n function Document(root, options) {\n this.root = root;\n if (options == null) {\n options = {};\n }\n this.normalizer = new Normalizer();\n this.formats = {};\n _.each(options.formats, _.bind(this.addFormat, this));\n this.setHTML(this.root.innerHTML);\n }\n\n Document.prototype.addFormat = function(name, config) {\n if (!_.isObject(config)) {\n config = Format.FORMATS[name];\n }\n if (this.formats[name] != null) {\n console.warn('Overwriting format', name, this.formats[name]);\n }\n this.formats[name] = new Format(config);\n return this.normalizer.addFormat(config);\n };\n\n Document.prototype.appendLine = function(lineNode) {\n return this.insertLineBefore(lineNode, null);\n };\n\n Document.prototype.findLeafAt = function(index, inclusive) {\n var line, offset, ref;\n ref = this.findLineAt(index), line = ref[0], offset = ref[1];\n if (line != null) {\n return line.findLeafAt(offset, inclusive);\n } else {\n return [void 0, offset];\n }\n };\n\n Document.prototype.findLine = function(node) {\n var line;\n while ((node != null) && (dom.BLOCK_TAGS[node.tagName] == null)) {\n node = node.parentNode;\n }\n line = node != null ? dom(node).data(Line.DATA_KEY) : void 0;\n if ((line != null ? line.node : void 0) === node) {\n return line;\n } else {\n return void 0;\n }\n };\n\n Document.prototype.findLineAt = function(index) {\n var curLine, length;\n if (!(this.lines.length > 0)) {\n return [void 0, index];\n }\n length = this.toDelta().length();\n if (index === length) {\n return [this.lines.last, this.lines.last.length];\n }\n if (index > length) {\n return [void 0, index - length];\n }\n curLine = this.lines.first;\n while (curLine != null) {\n if (index < curLine.length) {\n return [curLine, index];\n }\n index -= curLine.length;\n curLine = curLine.next;\n }\n return [void 0, index];\n };\n\n Document.prototype.getHTML = function() {\n return this.root.innerHTML.replace(/\\>\\s+\\</g, '> <');\n };\n\n Document.prototype.insertLineBefore = function(newLineNode, refLine) {\n var line;\n line = new Line(this, newLineNode);\n if (refLine != null) {\n if (!dom(newLineNode.parentNode).isElement()) {\n this.root.insertBefore(newLineNode, refLine.node);\n }\n this.lines.insertAfter(refLine.prev, line);\n } else {\n if (!dom(newLineNode.parentNode).isElement()) {\n this.root.appendChild(newLineNode);\n }\n this.lines.append(line);\n }\n return line;\n };\n\n Document.prototype.mergeLines = function(line, lineToMerge) {\n if (lineToMerge.length > 1) {\n if (line.length === 1) {\n dom(line.leaves.last.node).remove();\n }\n _.each(dom(lineToMerge.node).childNodes(), function(child) {\n if (child.tagName !== dom.DEFAULT_BREAK_TAG) {\n return line.node.appendChild(child);\n }\n });\n }\n this.removeLine(lineToMerge);\n return line.rebuild();\n };\n\n Document.prototype.optimizeLines = function() {\n return _.each(this.lines.toArray(), function(line, i) {\n line.optimize();\n return true;\n });\n };\n\n Document.prototype.rebuild = function() {\n var lineNode, lines, results;\n lines = this.lines.toArray();\n lineNode = this.root.firstChild;\n if ((lineNode != null) && (dom.LIST_TAGS[lineNode.tagName] != null)) {\n lineNode = lineNode.firstChild;\n }\n _.each(lines, (function(_this) {\n return function(line, index) {\n var newLine, ref;\n while (line.node !== lineNode) {\n if (line.node.parentNode === _this.root || ((ref = line.node.parentNode) != null ? ref.parentNode : void 0) === _this.root) {\n lineNode = _this.normalizer.normalizeLine(lineNode);\n newLine = _this.insertLineBefore(lineNode, line);\n lineNode = dom(lineNode).nextLineNode(_this.root);\n } else {\n return _this.removeLine(line);\n }\n }\n if (line.outerHTML !== lineNode.outerHTML) {\n line.node = _this.normalizer.normalizeLine(line.node);\n line.rebuild();\n }\n return lineNode = dom(lineNode).nextLineNode(_this.root);\n };\n })(this));\n results = [];\n while (lineNode != null) {\n lineNode = this.normalizer.normalizeLine(lineNode);\n this.appendLine(lineNode);\n results.push(lineNode = dom(lineNode).nextLineNode(this.root));\n }\n return results;\n };\n\n Document.prototype.removeLine = function(line) {\n if (line.node.parentNode != null) {\n if (dom.LIST_TAGS[line.node.parentNode.tagName] && line.node.parentNode.childNodes.length === 1) {\n dom(line.node.parentNode).remove();\n } else {\n dom(line.node).remove();\n }\n }\n return this.lines.remove(line);\n };\n\n Document.prototype.setHTML = function(html) {\n html = Normalizer.stripComments(html);\n html = Normalizer.stripWhitespace(html);\n this.root.innerHTML = html;\n this.lines = new LinkedList();\n return this.rebuild();\n };\n\n Document.prototype.splitLine = function(line, offset) {\n var lineNode1, lineNode2, newLine, ref;\n offset = Math.min(offset, line.length - 1);\n ref = dom(line.node).split(offset, true), lineNode1 = ref[0], lineNode2 = ref[1];\n line.node = lineNode1;\n line.rebuild();\n newLine = this.insertLineBefore(lineNode2, line.next);\n newLine.formats = _.clone(line.formats);\n newLine.resetContent();\n return newLine;\n };\n\n Document.prototype.toDelta = function() {\n var delta, lines;\n lines = this.lines.toArray();\n delta = new Delta();\n _.each(lines, function(line) {\n return _.each(line.delta.ops, function(op) {\n return delta.push(op);\n });\n });\n return delta;\n };\n\n return Document;\n\n})();\n\nmodule.exports = Document;\n\n\n},{\"../lib/dom\":17,\"../lib/linked-list\":18,\"./format\":10,\"./line\":12,\"./normalizer\":13,\"lodash\":1,\"rich-text/lib/delta\":3}],9:[function(_dereq_,module,exports){\nvar Delta, Document, Editor, Line, Selection, _, dom;\n\n_ = _dereq_('lodash');\n\nDelta = _dereq_('rich-text/lib/delta');\n\ndom = _dereq_('../lib/dom');\n\nDocument = _dereq_('./document');\n\nLine = _dereq_('./line');\n\nSelection = _dereq_('./selection');\n\nEditor = (function() {\n Editor.sources = {\n API: 'api',\n SILENT: 'silent',\n USER: 'user'\n };\n\n function Editor(root, quill, options) {\n this.root = root;\n this.quill = quill;\n this.options = options != null ? options : {};\n this.root.setAttribute('id', this.options.id);\n this.doc = new Document(this.root, this.options);\n this.delta = this.doc.toDelta();\n this.length = this.delta.length();\n this.selection = new Selection(this.doc, this.quill);\n this.timer = setInterval(_.bind(this.checkUpdate, this), this.options.pollInterval);\n this.savedRange = null;\n this.quill.on(\"selection-change\", (function(_this) {\n return function(range) {\n return _this.savedRange = range;\n };\n })(this));\n if (!this.options.readOnly) {\n this.enable();\n }\n }\n\n Editor.prototype.destroy = function() {\n return clearInterval(this.timer);\n };\n\n Editor.prototype.disable = function() {\n return this.enable(false);\n };\n\n Editor.prototype.enable = function(enabled) {\n if (enabled == null) {\n enabled = true;\n }\n return this.root.setAttribute('contenteditable', enabled);\n };\n\n Editor.prototype.applyDelta = function(delta, source) {\n var localDelta;\n localDelta = this._update();\n if (localDelta) {\n delta = localDelta.transform(delta, true);\n localDelta = delta.transform(localDelta, false);\n }\n if (delta.ops.length > 0) {\n delta = this._trackDelta((function(_this) {\n return function() {\n var index;\n index = 0;\n _.each(delta.ops, function(op) {\n if (_.isString(op.insert)) {\n _this._insertAt(index, op.insert, op.attributes);\n return index += op.insert.length;\n } else if (_.isNumber(op.insert)) {\n _this._insertEmbed(index, op.attributes);\n return index += 1;\n } else if (_.isNumber(op[\"delete\"])) {\n return _this._deleteAt(index, op[\"delete\"]);\n } else if (_.isNumber(op.retain)) {\n _.each(op.attributes, function(value, name) {\n return _this._formatAt(index, op.retain, name, value);\n });\n return index += op.retain;\n }\n });\n return _this.selection.shiftAfter(0, 0, _.bind(_this.doc.optimizeLines, _this.doc));\n };\n })(this));\n this.delta = this.doc.toDelta();\n this.length = this.delta.length();\n this.innerHTML = this.root.innerHTML;\n if (delta && source !== Editor.sources.SILENT) {\n this.quill.emit(this.quill.constructor.events.TEXT_CHANGE, delta, source);\n }\n }\n if (localDelta && localDelta.ops.length > 0 && source !== Editor.sources.SILENT) {\n return this.quill.emit(this.quill.constructor.events.TEXT_CHANGE, localDelta, Editor.sources.USER);\n }\n };\n\n Editor.prototype.checkUpdate = function(source) {\n var delta;\n if (source == null) {\n source = 'user';\n }\n if (this.root.parentNode == null) {\n return clearInterval(this.timer);\n }\n delta = this._update();\n if (delta) {\n this.delta = this.delta.compose(delta);\n this.length = this.delta.length();\n this.quill.emit(this.quill.constructor.events.TEXT_CHANGE, delta, source);\n }\n if (delta) {\n source = Editor.sources.SILENT;\n }\n return this.selection.update(source);\n };\n\n Editor.prototype.focus = function() {\n if (this.selection.range != null) {\n return this.selection.setRange(this.selection.range);\n } else {\n return this.root.focus();\n }\n };\n\n Editor.prototype.getBounds = function(index) {\n var bounds, containerBounds, leaf, offset, range, ref, side;\n this.checkUpdate();\n ref = this.doc.findLeafAt(index, true), leaf = ref[0], offset = ref[1];\n if (leaf == null) {\n return null;\n }\n containerBounds = this.root.parentNode.getBoundingClientRect();\n side = 'left';\n if (leaf.length === 0) {\n bounds = leaf.node.parentNode.getBoundingClientRect();\n } else if (dom.VOID_TAGS[leaf.node.tagName]) {\n bounds = leaf.node.getBoundingClientRect();\n if (offset === 1) {\n side = 'right';\n }\n } else {\n range = document.createRange();\n if (offset < leaf.length) {\n range.setStart(leaf.node, offset);\n range.setEnd(leaf.node, offset + 1);\n } else {\n range.setStart(leaf.node, offset - 1);\n range.setEnd(leaf.node, offset);\n side = 'right';\n }\n bounds = range.getBoundingClientRect();\n }\n return {\n height: bounds.height,\n left: bounds[side] - containerBounds.left,\n top: bounds.top - containerBounds.top\n };\n };\n\n Editor.prototype._deleteAt = function(index, length) {\n if (length <= 0) {\n return;\n }\n return this.selection.shiftAfter(index, -1 * length, (function(_this) {\n return function() {\n var curLine, deleteLength, firstLine, mergeFirstLine, nextLine, offset, ref;\n ref = _this.doc.findLineAt(index), firstLine = ref[0], offset = ref[1];\n curLine = firstLine;\n mergeFirstLine = firstLine.length - offset <= length && offset > 0;\n while ((curLine != null) && length > 0) {\n nextLine = curLine.next;\n deleteLength = Math.min(curLine.length - offset, length);\n if (offset === 0 && length >= curLine.length) {\n _this.doc.removeLine(curLine);\n } else {\n curLine.deleteText(offset, deleteLength);\n }\n length -= deleteLength;\n curLine = nextLine;\n offset = 0;\n }\n if (mergeFirstLine && firstLine.next) {\n return _this.doc.mergeLines(firstLine, firstLine.next);\n }\n };\n })(this));\n };\n\n Editor.prototype._formatAt = function(index, length, name, value) {\n return this.selection.shiftAfter(index, 0, (function(_this) {\n return function() {\n var formatLength, line, offset, ref, results;\n ref = _this.doc.findLineAt(index), line = ref[0], offset = ref[1];\n results = [];\n while ((line != null) && length > 0) {\n formatLength = Math.min(length, line.length - offset - 1);\n line.formatText(offset, formatLength, name, value);\n length -= formatLength;\n if (length > 0) {\n line.format(name, value);\n }\n length -= 1;\n offset = 0;\n results.push(line = line.next);\n }\n return results;\n };\n })(this));\n };\n\n Editor.prototype._insertEmbed = function(index, attributes) {\n return this.selection.shiftAfter(index, 1, (function(_this) {\n return function() {\n var line, offset, ref;\n ref = _this.doc.findLineAt(index), line = ref[0], offset = ref[1];\n return line.insertEmbed(offset, attributes);\n };\n })(this));\n };\n\n Editor.prototype._insertAt = function(index, text, formatting) {\n if (formatting == null) {\n formatting = {};\n }\n return this.selection.shiftAfter(index, text.length, (function(_this) {\n return function() {\n var line, lineTexts, offset, ref;\n text = text.replace(/\\r\\n?/g, '\\n');\n lineTexts = text.split('\\n');\n ref = _this.doc.findLineAt(index), line = ref[0], offset = ref[1];\n return _.each(lineTexts, function(lineText, i) {\n var nextLine;\n if ((line == null) || line.length <= offset) {\n if (i < lineTexts.length - 1 || lineText.length > 0) {\n line = _this.doc.appendLine(document.createElement(dom.DEFAULT_BLOCK_TAG));\n offset = 0;\n line.insertText(offset, lineText, formatting);\n line.format(formatting);\n nextLine = null;\n }\n } else {\n line.insertText(offset, lineText, formatting);\n if (i < lineTexts.length - 1) {\n nextLine = _this.doc.splitLine(line, offset + lineText.length);\n _.each(_.defaults({}, formatting, line.formats), function(value, format) {\n return line.format(format, formatting[format]);\n });\n offset = 0;\n }\n }\n return line = nextLine;\n });\n };\n })(this));\n };\n\n Editor.prototype._trackDelta = function(fn) {\n var ignored, newDelta, newIndex, newLeftDelta, newRightDelta, oldIndex, oldLeftDelta, oldRightDelta, ref, ref1;\n oldIndex = (ref = this.savedRange) != null ? ref.start : void 0;\n fn();\n newDelta = this.doc.toDelta();\n this.savedRange = this.selection.getRange();\n newIndex = (ref1 = this.savedRange) != null ? ref1.start : void 0;\n try {\n if ((oldIndex != null) && (newIndex != null) && oldIndex <= this.delta.length() && newIndex <= newDelta.length()) {\n oldRightDelta = this.delta.slice(oldIndex);\n newRightDelta = newDelta.slice(newIndex);\n if (_.isEqual(oldRightDelta.ops, newRightDelta.ops)) {\n oldLeftDelta = this.delta.slice(0, oldIndex);\n newLeftDelta = newDelta.slice(0, newIndex);\n return oldLeftDelta.diff(newLeftDelta);\n }\n }\n } catch (_error) {\n ignored = _error;\n }\n return this.delta.diff(newDelta);\n };\n\n Editor.prototype._update = function() {\n var delta;\n if (this.innerHTML === this.root.innerHTML) {\n return false;\n }\n delta = this._trackDelta((function(_this) {\n return function() {\n _this.selection.preserve(_.bind(_this.doc.rebuild, _this.doc));\n return _this.selection.shiftAfter(0, 0, _.bind(_this.doc.optimizeLines, _this.doc));\n };\n })(this));\n this.innerHTML = this.root.innerHTML;\n if (delta.ops.length > 0) {\n return delta;\n } else {\n return false;\n }\n };\n\n return Editor;\n\n})();\n\nmodule.exports = Editor;\n\n\n},{\"../lib/dom\":17,\"./document\":8,\"./line\":12,\"./selection\":14,\"lodash\":1,\"rich-text/lib/delta\":3}],10:[function(_dereq_,module,exports){\nvar Format, _, dom;\n\n_ = _dereq_('lodash');\n\ndom = _dereq_('../lib/dom');\n\nFormat = (function() {\n Format.types = {\n LINE: 'line',\n EMBED: 'embed'\n };\n\n Format.FORMATS = {\n bold: {\n tag: 'B',\n prepare: 'bold'\n },\n italic: {\n tag: 'I',\n prepare: 'italic'\n },\n underline: {\n tag: 'U',\n prepare: 'underline'\n },\n strike: {\n tag: 'S',\n prepare: 'strikeThrough'\n },\n color: {\n style: 'color',\n \"default\": 'rgb(0, 0, 0)',\n prepare: 'foreColor'\n },\n background: {\n style: 'backgroundColor',\n \"default\": 'rgb(255, 255, 255)',\n prepare: 'backColor'\n },\n font: {\n style: 'fontFamily',\n \"default\": \"'Helvetica', 'Arial', sans-serif\",\n prepare: 'fontName'\n },\n size: {\n style: 'fontSize',\n \"default\": '13px',\n prepare: function(value) {\n return document.execCommand('fontSize', false, dom.convertFontSize(value));\n }\n },\n link: {\n tag: 'A',\n add: function(node, value) {\n node.setAttribute('href', value);\n return node;\n },\n remove: function(node) {\n node.removeAttribute('href');\n return node;\n },\n value: function(node) {\n return node.getAttribute('href');\n }\n },\n image: {\n type: Format.types.EMBED,\n tag: 'IMG',\n attribute: 'src'\n },\n align: {\n type: Format.types.LINE,\n style: 'textAlign',\n \"default\": 'left'\n },\n bullet: {\n type: Format.types.LINE,\n exclude: 'list',\n parentTag: 'UL',\n tag: 'LI'\n },\n list: {\n type: Format.types.LINE,\n exclude: 'bullet',\n parentTag: 'OL',\n tag: 'LI'\n }\n };\n\n function Format(config) {\n this.config = config;\n }\n\n Format.prototype.add = function(node, value) {\n var formatNode, inline, parentNode, ref, ref1;\n if (!value) {\n return this.remove(node);\n }\n if (this.value(node) === value) {\n return node;\n }\n if (_.isString(this.config.parentTag)) {\n parentNode = node.parentNode;\n if (parentNode.tagName !== this.config.parentTag) {\n parentNode = document.createElement(this.config.parentTag);\n dom(node).wrap(parentNode);\n }\n if (node.parentNode.tagName === ((ref = node.parentNode.previousSibling) != null ? ref.tagName : void 0)) {\n dom(node.parentNode.previousSibling).merge(node.parentNode);\n }\n if (node.parentNode.tagName === ((ref1 = node.parentNode.nextSibling) != null ? ref1.tagName : void 0)) {\n dom(node.parentNode).merge(node.parentNode.nextSibling);\n }\n }\n if (_.isString(this.config.tag) && node.tagName !== this.config.tag) {\n formatNode = document.createElement(this.config.tag);\n if (dom.VOID_TAGS[formatNode.tagName] != null) {\n if (node.parentNode != null) {\n dom(node).replace(formatNode);\n }\n node = formatNode;\n } else if (this.isType(Format.types.LINE)) {\n node = dom(node).switchTag(this.config.tag).get();\n } else {\n dom(node).wrap(formatNode);\n node = formatNode;\n }\n }\n if (_.isString(this.config.style) || _.isString(this.config.attribute) || _.isString(this.config[\"class\"])) {\n if (_.isString(this.config[\"class\"])) {\n node = this.remove(node);\n }\n if (dom(node).isTextNode()) {\n inline = document.createElement(dom.DEFAULT_INLINE_TAG);\n dom(node).wrap(inline);\n node = inline;\n }\n if (_.isString(this.config.style)) {\n if (value !== this.config[\"default\"]) {\n node.style[this.config.style] = value;\n }\n }\n if (_.isString(this.config.attribute)) {\n node.setAttribute(this.config.attribute, value);\n }\n if (_.isString(this.config[\"class\"])) {\n dom(node).addClass(this.config[\"class\"] + value);\n }\n }\n if (_.isFunction(this.config.add)) {\n node = this.config.add(node, value);\n }\n return node;\n };\n\n Format.prototype.isType = function(type) {\n return type === this.config.type;\n };\n\n Format.prototype.match = function(node) {\n var c, i, len, ref, ref1;\n if (!dom(node).isElement()) {\n return false;\n }\n if (_.isString(this.config.parentTag) && ((ref = node.parentNode) != null ? ref.tagName : void 0) !== this.config.parentTag) {\n return false;\n }\n if (_.isString(this.config.tag) && node.tagName !== this.config.tag) {\n return false;\n }\n if (_.isString(this.config.style) && (!node.style[this.config.style] || node.style[this.config.style] === this.config[\"default\"])) {\n return false;\n }\n if (_.isString(this.config.attribute) && !node.hasAttribute(this.config.attribute)) {\n return false;\n }\n if (_.isString(this.config[\"class\"])) {\n ref1 = dom(node).classes();\n for (i = 0, len = ref1.length; i < len; i++) {\n c = ref1[i];\n if (c.indexOf(this.config[\"class\"]) === 0) {\n return true;\n }\n }\n return false;\n }\n return true;\n };\n\n Format.prototype.prepare = function(value) {\n if (_.isString(this.config.prepare)) {\n return document.execCommand(this.config.prepare, false, value);\n } else if (_.isFunction(this.config.prepare)) {\n return this.config.prepare(value);\n }\n };\n\n Format.prototype.remove = function(node) {\n var c, i, len, ref;\n if (!this.match(node)) {\n return node;\n }\n if (_.isString(this.config.style)) {\n node.style[this.config.style] = '';\n if (!node.getAttribute('style')) {\n node.removeAttribute('style');\n }\n }\n if (_.isString(this.config.attribute)) {\n node.removeAttribute(this.config.attribute);\n }\n if (_.isString(this.config[\"class\"])) {\n ref = dom(node).classes();\n for (i = 0, len = ref.length; i < len; i++) {\n c = ref[i];\n if (c.indexOf(this.config[\"class\"]) === 0) {\n dom(node).removeClass(c);\n }\n }\n }\n if (_.isString(this.config.tag)) {\n if (this.isType(Format.types.LINE)) {\n if (_.isString(this.config.parentTag)) {\n if (node.previousSibling != null) {\n dom(node).splitBefore(node.parentNode.parentNode);\n }\n if (node.nextSibling != null) {\n dom(node.nextSibling).splitBefore(node.parentNode.parentNode);\n }\n }\n node = dom(node).switchTag(dom.DEFAULT_BLOCK_TAG).get();\n } else if (this.isType(Format.types.EMBED)) {\n dom(node).remove();\n return void 0;\n } else {\n node = dom(node).switchTag(dom.DEFAULT_INLINE_TAG).get();\n }\n }\n if (_.isString(this.config.parentTag)) {\n dom(node.parentNode).unwrap();\n }\n if (_.isFunction(this.config.remove)) {\n node = this.config.remove(node);\n }\n if (node.tagName === dom.DEFAULT_INLINE_TAG && !node.hasAttributes()) {\n node = dom(node).unwrap();\n }\n return node;\n };\n\n Format.prototype.value = function(node) {\n var c, i, len, ref;\n if (!this.match(node)) {\n return void 0;\n }\n if (this.config.value) {\n return this.config.value(node);\n }\n if (_.isString(this.config.attribute)) {\n return node.getAttribute(this.config.attribute) || void 0;\n } else if (_.isString(this.config.style)) {\n return node.style[this.config.style] || void 0;\n } else if (_.isString(this.config[\"class\"])) {\n ref = dom(node).classes();\n for (i = 0, len = ref.length; i < len; i++) {\n c = ref[i];\n if (c.indexOf(this.config[\"class\"]) === 0) {\n return c.slice(this.config[\"class\"].length);\n }\n }\n } else if (_.isString(this.config.tag)) {\n return true;\n }\n return void 0;\n };\n\n return Format;\n\n})();\n\nmodule.exports = Format;\n\n\n},{\"../lib/dom\":17,\"lodash\":1}],11:[function(_dereq_,module,exports){\nvar Format, Leaf, LinkedList, _, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n_ = _dereq_('lodash');\n\ndom = _dereq_('../lib/dom');\n\nFormat = _dereq_('./format');\n\nLinkedList = _dereq_('../lib/linked-list');\n\nLeaf = (function(superClass) {\n extend(Leaf, superClass);\n\n Leaf.DATA_KEY = 'leaf';\n\n Leaf.isLeafNode = function(node) {\n return dom(node).isTextNode() || (node.firstChild == null);\n };\n\n function Leaf(node1, formats) {\n this.node = node1;\n this.formats = _.clone(formats);\n this.text = dom(this.node).text();\n this.length = this.text.length;\n dom(this.node).data(Leaf.DATA_KEY, this);\n }\n\n Leaf.prototype.deleteText = function(offset, length) {\n var textNode;\n if (!(length > 0)) {\n return;\n }\n this.text = this.text.slice(0, offset) + this.text.slice(offset + length);\n this.length = this.text.length;\n if (dom.EMBED_TAGS[this.node.tagName] != null) {\n textNode = document.createTextNode(this.text);\n dom(textNode).data(Leaf.DATA_KEY, this);\n return this.node = dom(this.node).replace(textNode).get();\n } else {\n return dom(this.node).text(this.text);\n }\n };\n\n Leaf.prototype.insertText = function(offset, text) {\n var textNode;\n this.text = this.text.slice(0, offset) + text + this.text.slice(offset);\n if (dom(this.node).isTextNode()) {\n dom(this.node).text(this.text);\n } else {\n textNode = document.createTextNode(text);\n dom(textNode).data(Leaf.DATA_KEY, this);\n if (this.node.tagName === dom.DEFAULT_BREAK_TAG) {\n this.node = dom(this.node).replace(textNode).get();\n } else {\n this.node.appendChild(textNode);\n this.node = textNode;\n }\n }\n return this.length = this.text.length;\n };\n\n return Leaf;\n\n})(LinkedList.Node);\n\nmodule.exports = Leaf;\n\n\n},{\"../lib/dom\":17,\"../lib/linked-list\":18,\"./format\":10,\"lodash\":1}],12:[function(_dereq_,module,exports){\nvar Delta, Format, Leaf, Line, LinkedList, Normalizer, _, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n_ = _dereq_('lodash');\n\nDelta = _dereq_('rich-text/lib/delta');\n\ndom = _dereq_('../lib/dom');\n\nFormat = _dereq_('./format');\n\nLeaf = _dereq_('./leaf');\n\nLine = _dereq_('./line');\n\nLinkedList = _dereq_('../lib/linked-list');\n\nNormalizer = _dereq_('./normalizer');\n\nLine = (function(superClass) {\n extend(Line, superClass);\n\n Line.DATA_KEY = 'line';\n\n function Line(doc, node1) {\n this.doc = doc;\n this.node = node1;\n this.formats = {};\n this.rebuild();\n Line.__super__.constructor.call(this, this.node);\n }\n\n Line.prototype.buildLeaves = function(node, formats) {\n return _.each(dom(node).childNodes(), (function(_this) {\n return function(node) {\n var nodeFormats;\n node = _this.doc.normalizer.normalizeNode(node);\n nodeFormats = _.clone(formats);\n _.each(_this.doc.formats, function(format, name) {\n if (!format.isType(Format.types.LINE) && format.match(node)) {\n return nodeFormats[name] = format.value(node);\n }\n });\n if (Leaf.isLeafNode(node)) {\n return _this.leaves.append(new Leaf(node, nodeFormats));\n } else {\n return _this.buildLeaves(node, nodeFormats);\n }\n };\n })(this));\n };\n\n Line.prototype.deleteText = function(offset, length) {\n var deleteLength, leaf, ref;\n if (!(length > 0)) {\n return;\n }\n ref = this.findLeafAt(offset), leaf = ref[0], offset = ref[1];\n while ((leaf != null) && length > 0) {\n deleteLength = Math.min(length, leaf.length - offset);\n leaf.deleteText(offset, deleteLength);\n length -= deleteLength;\n leaf = leaf.next;\n offset = 0;\n }\n return this.rebuild();\n };\n\n Line.prototype.findLeaf = function(leafNode) {\n if (leafNode != null) {\n return dom(leafNode).data(Leaf.DATA_KEY);\n } else {\n return void 0;\n }\n };\n\n Line.prototype.findLeafAt = function(offset, inclusive) {\n var leaf;\n if (inclusive == null) {\n inclusive = false;\n }\n if (offset >= this.length - 1) {\n return [this.leaves.last, this.leaves.last.length];\n }\n leaf = this.leaves.first;\n while (leaf != null) {\n if (offset < leaf.length || (offset === leaf.length && inclusive)) {\n return [leaf, offset];\n }\n offset -= leaf.length;\n leaf = leaf.next;\n }\n return [this.leaves.last, offset - this.leaves.last.length];\n };\n\n Line.prototype.format = function(name, value) {\n var formats;\n if (_.isObject(name)) {\n formats = name;\n } else {\n formats = {};\n formats[name] = value;\n }\n _.each(formats, (function(_this) {\n return function(value, name) {\n var excludeFormat, format;\n format = _this.doc.formats[name];\n if (format == null) {\n return;\n }\n if (format.isType(Format.types.LINE)) {\n if (format.config.exclude && _this.formats[format.config.exclude]) {\n excludeFormat = _this.doc.formats[format.config.exclude];\n if (excludeFormat != null) {\n _this.node = excludeFormat.remove(_this.node);\n delete _this.formats[format.config.exclude];\n }\n }\n _this.node = format.add(_this.node, value);\n }\n if (value) {\n return _this.formats[name] = value;\n } else {\n return delete _this.formats[name];\n }\n };\n })(this));\n return this.resetContent();\n };\n\n Line.prototype.formatText = function(offset, length, name, value) {\n var format, leaf, leafOffset, leftNode, nextLeaf, ref, ref1, ref2, rightNode, targetNode;\n ref = this.findLeafAt(offset), leaf = ref[0], leafOffset = ref[1];\n format = this.doc.formats[name];\n if (!((format != null) && format.config.type !== Format.types.LINE)) {\n return;\n }\n while ((leaf != null) && length > 0) {\n nextLeaf = leaf.next;\n if ((value && leaf.formats[name] !== value) || (!value && (leaf.formats[name] != null))) {\n targetNode = leaf.node;\n if (leaf.formats[name] != null) {\n dom(targetNode).splitBefore(this.node);\n while (!format.match(targetNode)) {\n targetNode = targetNode.parentNode;\n }\n dom(targetNode).split(leaf.length);\n }\n if (leafOffset > 0) {\n ref1 = dom(targetNode).split(leafOffset), leftNode = ref1[0], targetNode = ref1[1];\n }\n if (leaf.length > leafOffset + length) {\n ref2 = dom(targetNode).split(length), targetNode = ref2[0], rightNode = ref2[1];\n }\n format.add(targetNode, value);\n }\n length -= leaf.length - leafOffset;\n leafOffset = 0;\n leaf = nextLeaf;\n }\n return this.rebuild();\n };\n\n Line.prototype._insert = function(offset, node, formats) {\n var leaf, leafOffset, nextNode, prevNode, ref, ref1;\n ref = this.findLeafAt(offset), leaf = ref[0], leafOffset = ref[1];\n node = _.reduce(formats, (function(_this) {\n return function(node, value, name) {\n var format;\n format = _this.doc.formats[name];\n if ((format != null) && !format.isType(Format.types.LINE)) {\n node = format.add(node, value);\n }\n return node;\n };\n })(this), node);\n ref1 = dom(leaf.node).split(leafOffset), prevNode = ref1[0], nextNode = ref1[1];\n if (nextNode) {\n nextNode = dom(nextNode).splitBefore(this.node).get();\n }\n this.node.insertBefore(node, nextNode);\n return this.rebuild();\n };\n\n Line.prototype.insertEmbed = function(offset, attributes) {\n var formatName, leaf, leafOffset, nextNode, node, prevNode, ref, ref1;\n ref = this.findLeafAt(offset), leaf = ref[0], leafOffset = ref[1];\n ref1 = dom(leaf.node).split(leafOffset), prevNode = ref1[0], nextNode = ref1[1];\n formatName = _.find(Object.keys(attributes), (function(_this) {\n return function(name) {\n return _this.doc.formats[name].isType(Format.types.EMBED);\n };\n })(this));\n node = this.doc.formats[formatName].add({}, attributes[formatName]);\n attributes = _.clone(attributes);\n delete attributes[formatName];\n return this._insert(offset, node, attributes);\n };\n\n Line.prototype.insertText = function(offset, text, formats) {\n var leaf, leafOffset, ref;\n if (formats == null) {\n formats = {};\n }\n if (!(text.length > 0)) {\n return;\n }\n ref = this.findLeafAt(offset), leaf = ref[0], leafOffset = ref[1];\n if (_.isEqual(leaf.formats, formats)) {\n leaf.insertText(leafOffset, text);\n return this.resetContent();\n } else {\n return this._insert(offset, document.createTextNode(text), formats);\n }\n };\n\n Line.prototype.optimize = function() {\n Normalizer.optimizeLine(this.node);\n return this.rebuild();\n };\n\n Line.prototype.rebuild = function(force) {\n if (force == null) {\n force = false;\n }\n if (!force && (this.outerHTML != null) && this.outerHTML === this.node.outerHTML) {\n if (_.all(this.leaves.toArray(), (function(_this) {\n return function(leaf) {\n return dom(leaf.node).isAncestor(_this.node);\n };\n })(this))) {\n return false;\n }\n }\n this.node = this.doc.normalizer.normalizeNode(this.node);\n if (dom(this.node).length() === 0 && !this.node.querySelector(dom.DEFAULT_BREAK_TAG)) {\n this.node.appendChild(document.createElement(dom.DEFAULT_BREAK_TAG));\n }\n this.leaves = new LinkedList();\n this.formats = _.reduce(this.doc.formats, (function(_this) {\n return function(formats, format, name) {\n if (format.isType(Format.types.LINE)) {\n if (format.match(_this.node)) {\n formats[name] = format.value(_this.node);\n } else {\n delete formats[name];\n }\n }\n return formats;\n };\n })(this), this.formats);\n this.buildLeaves(this.node, {});\n this.resetContent();\n return true;\n };\n\n Line.prototype.resetContent = function() {\n dom(this.node).data(Line.DATA_KEY, this);\n this.outerHTML = this.node.outerHTML;\n this.length = 1;\n this.delta = new Delta();\n _.each(this.leaves.toArray(), (function(_this) {\n return function(leaf) {\n _this.length += leaf.length;\n if (dom.EMBED_TAGS[leaf.node.tagName] != null) {\n return _this.delta.insert(1, leaf.formats);\n } else {\n return _this.delta.insert(leaf.text, leaf.formats);\n }\n };\n })(this));\n return this.delta.insert('\\n', this.formats);\n };\n\n return Line;\n\n})(LinkedList.Node);\n\nmodule.exports = Line;\n\n\n},{\"../lib/dom\":17,\"../lib/linked-list\":18,\"./format\":10,\"./leaf\":11,\"./line\":12,\"./normalizer\":13,\"lodash\":1,\"rich-text/lib/delta\":3}],13:[function(_dereq_,module,exports){\nvar Normalizer, _, camelize, dom;\n\n_ = _dereq_('lodash');\n\ndom = _dereq_('../lib/dom');\n\ncamelize = function(str) {\n str = str.replace(/(?:^|[-_])(\\w)/g, function(i, c) {\n if (c) {\n return c.toUpperCase();\n } else {\n return '';\n }\n });\n return str.charAt(0).toLowerCase() + str.slice(1);\n};\n\nNormalizer = (function() {\n Normalizer.ALIASES = {\n 'STRONG': 'B',\n 'EM': 'I',\n 'DEL': 'S',\n 'STRIKE': 'S'\n };\n\n Normalizer.ATTRIBUTES = {\n 'color': 'color',\n 'face': 'fontFamily',\n 'size': 'fontSize'\n };\n\n function Normalizer() {\n this.whitelist = {\n styles: {},\n tags: {}\n };\n this.whitelist.tags[dom.DEFAULT_BREAK_TAG] = true;\n this.whitelist.tags[dom.DEFAULT_BLOCK_TAG] = true;\n this.whitelist.tags[dom.DEFAULT_INLINE_TAG] = true;\n }\n\n Normalizer.prototype.addFormat = function(config) {\n if (config.tag != null) {\n this.whitelist.tags[config.tag] = true;\n }\n if (config.parentTag != null) {\n this.whitelist.tags[config.parentTag] = true;\n }\n if (config.style != null) {\n return this.whitelist.styles[config.style] = true;\n }\n };\n\n Normalizer.prototype.normalizeLine = function(lineNode) {\n lineNode = Normalizer.wrapInline(lineNode);\n lineNode = Normalizer.handleBreaks(lineNode);\n if (lineNode.tagName === 'LI') {\n Normalizer.flattenList(lineNode);\n }\n lineNode = Normalizer.pullBlocks(lineNode);\n lineNode = this.normalizeNode(lineNode);\n Normalizer.unwrapText(lineNode);\n if ((lineNode != null) && (dom.LIST_TAGS[lineNode.tagName] != null)) {\n lineNode = lineNode.firstChild;\n }\n return lineNode;\n };\n\n Normalizer.prototype.normalizeNode = function(node) {\n if (dom(node).isTextNode()) {\n return node;\n }\n _.each(Normalizer.ATTRIBUTES, function(style, attribute) {\n var value;\n if (node.hasAttribute(attribute)) {\n value = node.getAttribute(attribute);\n if (attribute === 'size') {\n value = dom.convertFontSize(value);\n }\n node.style[style] = value;\n return node.removeAttribute(attribute);\n }\n });\n if (node.style.fontWeight === 'bold' || node.style.fontWeight > 500) {\n node.style.fontWeight = '';\n dom(node).wrap(document.createElement('b'));\n node = node.parentNode;\n }\n this.whitelistStyles(node);\n return this.whitelistTags(node);\n };\n\n Normalizer.prototype.whitelistStyles = function(node) {\n var original, styles;\n original = dom(node).styles();\n styles = _.omit(original, (function(_this) {\n return function(value, key) {\n return _this.whitelist.styles[camelize(key)] == null;\n };\n })(this));\n if (Object.keys(styles).length < Object.keys(original).length) {\n if (Object.keys(styles).length > 0) {\n return dom(node).styles(styles, true);\n } else {\n return node.removeAttribute('style');\n }\n }\n };\n\n Normalizer.prototype.whitelistTags = function(node) {\n if (!dom(node).isElement()) {\n return node;\n }\n if (Normalizer.ALIASES[node.tagName] != null) {\n node = dom(node).switchTag(Normalizer.ALIASES[node.tagName]).get();\n } else if (this.whitelist.tags[node.tagName] == null) {\n if (dom.BLOCK_TAGS[node.tagName] != null) {\n node = dom(node).switchTag(dom.DEFAULT_BLOCK_TAG).get();\n } else if (!node.hasAttributes() && (node.firstChild != null)) {\n node = dom(node).unwrap();\n } else {\n node = dom(node).switchTag(dom.DEFAULT_INLINE_TAG).get();\n }\n }\n return node;\n };\n\n Normalizer.flattenList = function(listNode) {\n var innerItems, innerLists, ref;\n ref = listNode.nextSibling;\n innerItems = _.map(listNode.querySelectorAll('li'));\n innerItems.forEach(function(item) {\n listNode.parentNode.insertBefore(item, ref);\n return ref = item.nextSibling;\n });\n innerLists = _.map(listNode.querySelectorAll(Object.keys(dom.LIST_TAGS).join(',')));\n return innerLists.forEach(function(list) {\n return dom(list).remove();\n });\n };\n\n Normalizer.handleBreaks = function(lineNode) {\n var breaks;\n breaks = _.map(lineNode.querySelectorAll(dom.DEFAULT_BREAK_TAG));\n _.each(breaks, (function(_this) {\n return function(br) {\n if ((br.nextSibling != null) && (!dom.isIE(10) || (br.previousSibling != null))) {\n return dom(br.nextSibling).splitBefore(lineNode.parentNode);\n }\n };\n })(this));\n return lineNode;\n };\n\n Normalizer.optimizeLine = function(lineNode) {\n var lineNodeLength, node, nodes, results;\n lineNode.normalize();\n lineNodeLength = dom(lineNode).length();\n nodes = dom(lineNode).descendants();\n results = [];\n while (nodes.length > 0) {\n node = nodes.pop();\n if ((node != null ? node.parentNode : void 0) == null) {\n continue;\n }\n if (dom.EMBED_TAGS[node.tagName] != null) {\n continue;\n }\n if (node.tagName === dom.DEFAULT_BREAK_TAG) {\n if (lineNodeLength !== 0) {\n results.push(dom(node).remove());\n } else {\n results.push(void 0);\n }\n } else if (dom(node).length() === 0) {\n nodes.push(node.nextSibling);\n results.push(dom(node).unwrap());\n } else if ((node.previousSibling != null) && node.tagName === node.previousSibling.tagName) {\n if (_.isEqual(dom(node).attributes(), dom(node.previousSibling).attributes())) {\n nodes.push(node.firstChild);\n results.push(dom(node.previousSibling).merge(node));\n } else {\n results.push(void 0);\n }\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n\n Normalizer.pullBlocks = function(lineNode) {\n var curNode;\n curNode = lineNode.firstChild;\n while (curNode != null) {\n if ((dom.BLOCK_TAGS[curNode.tagName] != null) && curNode.tagName !== 'LI') {\n dom(curNode).isolate(lineNode.parentNode);\n if ((dom.LIST_TAGS[curNode.tagName] == null) || !curNode.firstChild) {\n dom(curNode).unwrap();\n Normalizer.pullBlocks(lineNode);\n } else {\n dom(curNode.parentNode).unwrap();\n if (lineNode.parentNode == null) {\n lineNode = curNode;\n }\n }\n break;\n }\n curNode = curNode.nextSibling;\n }\n return lineNode;\n };\n\n Normalizer.stripComments = function(html) {\n return html.replace(/<!--[\\s\\S]*?-->/g, '');\n };\n\n Normalizer.stripWhitespace = function(html) {\n html = html.trim();\n html = html.replace(/(\\r?\\n|\\r)+/g, ' ');\n html = html.replace(/\\>\\s+\\</g, '><');\n return html;\n };\n\n Normalizer.wrapInline = function(lineNode) {\n var blockNode, nextNode;\n if (dom.BLOCK_TAGS[lineNode.tagName] != null) {\n return lineNode;\n }\n blockNode = document.createElement(dom.DEFAULT_BLOCK_TAG);\n lineNode.parentNode.insertBefore(blockNode, lineNode);\n while ((lineNode != null) && (dom.BLOCK_TAGS[lineNode.tagName] == null)) {\n nextNode = lineNode.nextSibling;\n blockNode.appendChild(lineNode);\n lineNode = nextNode;\n }\n return blockNode;\n };\n\n Normalizer.unwrapText = function(lineNode) {\n var spans;\n spans = _.map(lineNode.querySelectorAll(dom.DEFAULT_INLINE_TAG));\n return _.each(spans, function(span) {\n if (!span.hasAttributes()) {\n return dom(span).unwrap();\n }\n });\n };\n\n return Normalizer;\n\n})();\n\nmodule.exports = Normalizer;\n\n\n},{\"../lib/dom\":17,\"lodash\":1}],14:[function(_dereq_,module,exports){\nvar Leaf, Normalizer, Range, Selection, _, dom;\n\n_ = _dereq_('lodash');\n\ndom = _dereq_('../lib/dom');\n\nLeaf = _dereq_('./leaf');\n\nNormalizer = _dereq_('./normalizer');\n\nRange = _dereq_('../lib/range');\n\nSelection = (function() {\n function Selection(doc, emitter) {\n this.doc = doc;\n this.emitter = emitter;\n this.focus = false;\n this.range = new Range(0, 0);\n this.nullDelay = false;\n this.update('silent');\n }\n\n Selection.prototype.checkFocus = function() {\n return document.activeElement === this.doc.root;\n };\n\n Selection.prototype.getRange = function(ignoreFocus) {\n var end, nativeRange, start;\n if (ignoreFocus == null) {\n ignoreFocus = false;\n }\n if (this.checkFocus()) {\n nativeRange = this._getNativeRange();\n if (nativeRange == null) {\n return null;\n }\n start = this._positionToIndex(nativeRange.startContainer, nativeRange.startOffset);\n if (nativeRange.startContainer === nativeRange.endContainer && nativeRange.startOffset === nativeRange.endOffset) {\n end = start;\n } else {\n end = this._positionToIndex(nativeRange.endContainer, nativeRange.endOffset);\n }\n return new Range(Math.min(start, end), Math.max(start, end));\n } else if (ignoreFocus) {\n return this.range;\n } else {\n return null;\n }\n };\n\n Selection.prototype.preserve = function(fn) {\n var endNode, endOffset, nativeRange, ref, ref1, ref2, ref3, startNode, startOffset;\n nativeRange = this._getNativeRange();\n if ((nativeRange != null) && this.checkFocus()) {\n ref = this._encodePosition(nativeRange.startContainer, nativeRange.startOffset), startNode = ref[0], startOffset = ref[1];\n ref1 = this._encodePosition(nativeRange.endContainer, nativeRange.endOffset), endNode = ref1[0], endOffset = ref1[1];\n fn();\n ref2 = this._decodePosition(startNode, startOffset), startNode = ref2[0], startOffset = ref2[1];\n ref3 = this._decodePosition(endNode, endOffset), endNode = ref3[0], endOffset = ref3[1];\n return this._setNativeRange(startNode, startOffset, endNode, endOffset);\n } else {\n return fn();\n }\n };\n\n Selection.prototype.scrollIntoView = function() {\n var containerBounds, containerHeight, editor, endBounds, line, offset, ref, ref1, startBounds;\n if (!this.range) {\n return;\n }\n editor = this.emitter.editor;\n startBounds = editor.getBounds(this.range.start);\n endBounds = this.range.isCollapsed() ? startBounds : editor.getBounds(this.range.end);\n containerBounds = editor.root.parentNode.getBoundingClientRect();\n containerHeight = containerBounds.bottom - containerBounds.top;\n if (containerHeight < endBounds.top + endBounds.height) {\n ref = editor.doc.findLineAt(this.range.end), line = ref[0], offset = ref[1];\n return line.node.scrollIntoView(false);\n } else if (startBounds.top < 0) {\n ref1 = editor.doc.findLineAt(this.range.start), line = ref1[0], offset = ref1[1];\n return line.node.scrollIntoView();\n }\n };\n\n Selection.prototype.setRange = function(range, source) {\n var endNode, endOffset, ref, ref1, ref2, startNode, startOffset;\n if (range != null) {\n ref = this._indexToPosition(range.start), startNode = ref[0], startOffset = ref[1];\n if (range.isCollapsed()) {\n ref1 = [startNode, startOffset], endNode = ref1[0], endOffset = ref1[1];\n } else {\n ref2 = this._indexToPosition(range.end), endNode = ref2[0], endOffset = ref2[1];\n }\n this._setNativeRange(startNode, startOffset, endNode, endOffset);\n } else {\n this._setNativeRange(null);\n }\n return this.update(source);\n };\n\n Selection.prototype.shiftAfter = function(index, length, fn) {\n var range;\n range = this.getRange();\n fn();\n if (range != null) {\n range.shift(index, length);\n return this.setRange(range, 'silent');\n }\n };\n\n Selection.prototype.update = function(source) {\n var emit, focus, range, toEmit;\n focus = this.checkFocus();\n range = this.getRange(true);\n emit = source !== 'silent' && (!Range.compare(range, this.range) || focus !== this.focus);\n toEmit = focus ? range : null;\n if (toEmit === null && source === 'user' && !this.nullDelay) {\n return this.nullDelay = true;\n } else {\n this.nullDelay = false;\n this.range = range;\n this.focus = focus;\n if (emit) {\n return this.emitter.emit(this.emitter.constructor.events.SELECTION_CHANGE, toEmit, source);\n }\n }\n };\n\n Selection.prototype._decodePosition = function(node, offset) {\n var childIndex;\n if (dom(node).isElement()) {\n childIndex = dom(node.parentNode).childNodes().indexOf(node);\n offset += childIndex;\n node = node.parentNode;\n }\n return [node, offset];\n };\n\n Selection.prototype._encodePosition = function(node, offset) {\n var text;\n while (true) {\n if (dom(node).isTextNode() || node.tagName === dom.DEFAULT_BREAK_TAG || (dom.EMBED_TAGS[node.tagName] != null)) {\n return [node, offset];\n } else if (offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n } else if (node.childNodes.length === 0) {\n if (this.doc.normalizer.whitelist.tags[node.tagName] == null) {\n text = document.createTextNode('');\n node.appendChild(text);\n node = text;\n }\n return [node, 0];\n } else {\n node = node.lastChild;\n if (dom(node).isElement()) {\n if (node.tagName === dom.DEFAULT_BREAK_TAG || (dom.EMBED_TAGS[node.tagName] != null)) {\n return [node, 1];\n } else {\n offset = node.childNodes.length;\n }\n } else {\n return [node, dom(node).length()];\n }\n }\n }\n };\n\n Selection.prototype._getNativeRange = function() {\n var range, selection;\n selection = document.getSelection();\n if ((selection != null ? selection.rangeCount : void 0) > 0) {\n range = selection.getRangeAt(0);\n if (dom(range.startContainer).isAncestor(this.doc.root, true)) {\n if (range.startContainer === range.endContainer || dom(range.endContainer).isAncestor(this.doc.root, true)) {\n return range;\n }\n }\n }\n return null;\n };\n\n Selection.prototype._indexToPosition = function(index) {\n var leaf, offset, ref;\n if (this.doc.lines.length === 0) {\n return [this.doc.root, 0];\n }\n ref = this.doc.findLeafAt(index, true), leaf = ref[0], offset = ref[1];\n return this._decodePosition(leaf.node, offset);\n };\n\n Selection.prototype._positionToIndex = function(node, offset) {\n var leaf, leafNode, leafOffset, line, lineOffset, ref;\n if (dom.isIE(10) && node.tagName === 'BR' && offset === 1) {\n offset = 0;\n }\n ref = this._encodePosition(node, offset), leafNode = ref[0], offset = ref[1];\n line = this.doc.findLine(leafNode);\n if (line == null) {\n return 0;\n }\n leaf = line.findLeaf(leafNode);\n lineOffset = 0;\n while (line.prev != null) {\n line = line.prev;\n lineOffset += line.length;\n }\n if (leaf == null) {\n return lineOffset;\n }\n leafOffset = 0;\n while (leaf.prev != null) {\n leaf = leaf.prev;\n leafOffset += leaf.length;\n }\n return lineOffset + leafOffset + offset;\n };\n\n Selection.prototype._setNativeRange = function(startNode, startOffset, endNode, endOffset) {\n var nativeRange, selection;\n selection = document.getSelection();\n if (!selection) {\n return;\n }\n if (startNode != null) {\n if (!this.checkFocus()) {\n this.doc.root.focus();\n }\n nativeRange = this._getNativeRange();\n if ((nativeRange == null) || startNode !== nativeRange.startContainer || startOffset !== nativeRange.startOffset || endNode !== nativeRange.endContainer || endOffset !== nativeRange.endOffset) {\n selection.removeAllRanges();\n nativeRange = document.createRange();\n nativeRange.setStart(startNode, startOffset);\n nativeRange.setEnd(endNode, endOffset);\n return selection.addRange(nativeRange);\n }\n } else {\n selection.removeAllRanges();\n this.doc.root.blur();\n if (dom.isIE(11) && !dom.isIE(9)) {\n return document.body.focus();\n }\n }\n };\n\n return Selection;\n\n})();\n\nmodule.exports = Selection;\n\n\n},{\"../lib/dom\":17,\"../lib/range\":20,\"./leaf\":11,\"./normalizer\":13,\"lodash\":1}],15:[function(_dereq_,module,exports){\n_dereq_('./modules/authorship');\n\n_dereq_('./modules/image-tooltip');\n\n_dereq_('./modules/keyboard');\n\n_dereq_('./modules/link-tooltip');\n\n_dereq_('./modules/multi-cursor');\n\n_dereq_('./modules/paste-manager');\n\n_dereq_('./modules/toolbar');\n\n_dereq_('./modules/tooltip');\n\n_dereq_('./modules/undo-manager');\n\nmodule.exports = _dereq_('./quill');\n\n\n},{\"./modules/authorship\":21,\"./modules/image-tooltip\":22,\"./modules/keyboard\":23,\"./modules/link-tooltip\":24,\"./modules/multi-cursor\":25,\"./modules/paste-manager\":26,\"./modules/toolbar\":27,\"./modules/tooltip\":28,\"./modules/undo-manager\":29,\"./quill\":30}],16:[function(_dereq_,module,exports){\nvar ColorPicker, Picker, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\ndom = _dereq_('./dom');\n\nPicker = _dereq_('./picker');\n\nColorPicker = (function(superClass) {\n extend(ColorPicker, superClass);\n\n function ColorPicker() {\n ColorPicker.__super__.constructor.apply(this, arguments);\n dom(this.container).addClass('ql-color-picker');\n }\n\n ColorPicker.prototype.buildItem = function(picker, option, index) {\n var item;\n item = ColorPicker.__super__.buildItem.call(this, picker, option, index);\n item.style.backgroundColor = option.value;\n return item;\n };\n\n return ColorPicker;\n\n})(Picker);\n\nmodule.exports = ColorPicker;\n\n\n},{\"./dom\":17,\"./picker\":19}],17:[function(_dereq_,module,exports){\nvar SelectWrapper, Wrapper, _, dom, lastKeyEvent,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n_ = _dereq_('lodash');\n\nlastKeyEvent = null;\n\nWrapper = (function() {\n function Wrapper(node1) {\n this.node = node1;\n this.trigger = bind(this.trigger, this);\n }\n\n Wrapper.prototype.addClass = function(cssClass) {\n if (this.hasClass(cssClass)) {\n return;\n }\n if (this.node.classList != null) {\n this.node.classList.add(cssClass);\n } else if (this.node.className != null) {\n this.node.className = (this.node.className + ' ' + cssClass).trim();\n }\n return this;\n };\n\n Wrapper.prototype.attributes = function(attributes) {\n var attr, i, j, len, ref, value;\n if (attributes) {\n _.each(attributes, (function(_this) {\n return function(value, name) {\n return _this.node.setAttribute(name, value);\n };\n })(this));\n return this;\n } else {\n if (this.node.attributes == null) {\n return {};\n }\n attributes = {};\n ref = this.node.attributes;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n value = ref[i];\n attr = this.node.attributes[i];\n attributes[attr.name] = attr.value;\n }\n return attributes;\n }\n };\n\n Wrapper.prototype.child = function(offset) {\n var child, length;\n child = this.node.firstChild;\n length = dom(child).length();\n while (child != null) {\n if (offset < length) {\n break;\n }\n offset -= length;\n child = child.nextSibling;\n length = dom(child).length();\n }\n if (child == null) {\n child = this.node.lastChild;\n offset = dom(child).length();\n }\n return [child, offset];\n };\n\n Wrapper.prototype.childNodes = function() {\n return _.map(this.node.childNodes);\n };\n\n Wrapper.prototype.classes = function() {\n return this.node.className.split(/\\s+/);\n };\n\n Wrapper.prototype.data = function(key, value) {\n var ref;\n if (value != null) {\n if (this.node['ql-data'] == null) {\n this.node['ql-data'] = {};\n }\n this.node['ql-data'][key] = value;\n return this;\n } else {\n return (ref = this.node['ql-data']) != null ? ref[key] : void 0;\n }\n };\n\n Wrapper.prototype.descendants = function() {\n return _.map(this.node.getElementsByTagName('*'));\n };\n\n Wrapper.prototype.get = function() {\n return this.node;\n };\n\n Wrapper.prototype.hasClass = function(cssClass) {\n if (this.node.classList != null) {\n return this.node.classList.contains(cssClass);\n } else if (this.node.className != null) {\n return this.classes().indexOf(cssClass) > -1;\n }\n return false;\n };\n\n Wrapper.prototype.isAncestor = function(ancestor, inclusive) {\n var node;\n if (inclusive == null) {\n inclusive = false;\n }\n if (ancestor === this.node) {\n return inclusive;\n }\n node = this.node;\n while (node) {\n if (node === ancestor) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n };\n\n Wrapper.prototype.isElement = function() {\n var ref;\n return ((ref = this.node) != null ? ref.nodeType : void 0) === dom.ELEMENT_NODE;\n };\n\n Wrapper.prototype.isTextNode = function() {\n var ref;\n return ((ref = this.node) != null ? ref.nodeType : void 0) === dom.TEXT_NODE;\n };\n\n Wrapper.prototype.isolate = function(root) {\n if (this.node.nextSibling != null) {\n dom(this.node.nextSibling).splitBefore(root);\n }\n this.splitBefore(root);\n return this;\n };\n\n Wrapper.prototype.length = function() {\n var length;\n if (this.node == null) {\n return 0;\n }\n length = this.text().length;\n if (this.isElement()) {\n length += this.node.querySelectorAll(Object.keys(dom.EMBED_TAGS).join(',')).length;\n }\n return length;\n };\n\n Wrapper.prototype.merge = function(node) {\n var $node;\n $node = dom(node);\n if (this.isElement()) {\n $node.moveChildren(this.node);\n this.normalize();\n } else {\n this.text(this.text() + $node.text());\n }\n $node.remove();\n return this;\n };\n\n Wrapper.prototype.moveChildren = function(newParent) {\n _.each(this.childNodes(), function(child) {\n return newParent.appendChild(child);\n });\n return this;\n };\n\n Wrapper.prototype.nextLineNode = function(root) {\n var nextNode;\n nextNode = this.node.nextSibling;\n if ((nextNode == null) && this.node.parentNode !== root) {\n nextNode = this.node.parentNode.nextSibling;\n }\n if ((nextNode != null) && (dom.LIST_TAGS[nextNode.tagName] != null)) {\n nextNode = nextNode.firstChild;\n }\n return nextNode;\n };\n\n Wrapper.prototype.normalize = function() {\n var $node, curNode, followingNode, nextNode;\n curNode = this.node.firstChild;\n while (curNode != null) {\n nextNode = curNode.nextSibling;\n $node = dom(curNode);\n if ((nextNode != null) && dom(nextNode).isTextNode()) {\n if ($node.text().length === 0) {\n $node.remove();\n } else if ($node.isTextNode()) {\n followingNode = nextNode.nextSibling;\n $node.merge(nextNode);\n nextNode = followingNode;\n }\n }\n curNode = nextNode;\n }\n return this;\n };\n\n Wrapper.prototype.on = function(eventName, listener) {\n this.node.addEventListener(eventName, (function(_this) {\n return function(event) {\n var arg, propagate;\n arg = lastKeyEvent && (eventName === 'keydown' || eventName === 'keyup') ? lastKeyEvent : event;\n propagate = listener.call(_this.node, arg);\n if (!propagate) {\n event.preventDefault();\n event.stopPropagation();\n }\n return propagate;\n };\n })(this));\n return this;\n };\n\n Wrapper.prototype.remove = function() {\n var ref;\n if ((ref = this.node.parentNode) != null) {\n ref.removeChild(this.node);\n }\n this.node = null;\n return null;\n };\n\n Wrapper.prototype.removeClass = function(cssClass) {\n var classArray;\n if (!this.hasClass(cssClass)) {\n return;\n }\n if (this.node.classList != null) {\n this.node.classList.remove(cssClass);\n } else if (this.node.className != null) {\n classArray = this.classes();\n classArray.splice(classArray.indexOf(cssClass), 1);\n this.node.className = classArray.join(' ');\n }\n if (!this.node.getAttribute('class')) {\n this.node.removeAttribute('class');\n }\n return this;\n };\n\n Wrapper.prototype.replace = function(newNode) {\n this.node.parentNode.replaceChild(newNode, this.node);\n this.node = newNode;\n return this;\n };\n\n Wrapper.prototype.splitBefore = function(root, force) {\n var nextNode, parentClone, parentNode, refNode;\n if (force == null) {\n force = false;\n }\n if (this.node === root || this.node.parentNode === root) {\n return this;\n }\n if ((this.node.previousSibling != null) || force) {\n parentNode = this.node.parentNode;\n parentClone = parentNode.cloneNode(false);\n parentNode.parentNode.insertBefore(parentClone, parentNode.nextSibling);\n refNode = this.node;\n while (refNode != null) {\n nextNode = refNode.nextSibling;\n parentClone.appendChild(refNode);\n refNode = nextNode;\n }\n return dom(parentClone).splitBefore(root);\n } else {\n return dom(this.node.parentNode).splitBefore(root);\n }\n };\n\n Wrapper.prototype.split = function(offset, force) {\n var after, child, childLeft, childRight, left, nextRight, nodeLength, ref, ref1, right;\n if (force == null) {\n force = false;\n }\n nodeLength = this.length();\n offset = Math.max(0, offset);\n offset = Math.min(offset, nodeLength);\n if (!(force || offset !== 0)) {\n return [this.node.previousSibling, this.node, false];\n }\n if (!(force || offset !== nodeLength)) {\n return [this.node, this.node.nextSibling, false];\n }\n if (this.node.nodeType === dom.TEXT_NODE) {\n after = this.node.splitText(offset);\n return [this.node, after, true];\n } else {\n left = this.node;\n right = this.node.cloneNode(false);\n this.node.parentNode.insertBefore(right, left.nextSibling);\n ref = this.child(offset), child = ref[0], offset = ref[1];\n ref1 = dom(child).split(offset), childLeft = ref1[0], childRight = ref1[1];\n while (childRight !== null) {\n nextRight = childRight.nextSibling;\n right.appendChild(childRight);\n childRight = nextRight;\n }\n return [left, right, true];\n }\n };\n\n Wrapper.prototype.styles = function(styles, overwrite) {\n var obj, styleString;\n if (overwrite == null) {\n overwrite = false;\n }\n if (styles) {\n if (!overwrite) {\n styles = _.defaults(styles, this.styles());\n }\n styleString = _.map(styles, function(style, name) {\n return name + \": \" + style;\n }).join('; ') + ';';\n this.node.setAttribute('style', styleString);\n return this;\n } else {\n styleString = this.node.getAttribute('style') || '';\n obj = _.reduce(styleString.split(';'), function(styles, str) {\n var name, ref, value;\n ref = str.split(':'), name = ref[0], value = ref[1];\n if (name && value) {\n name = name.trim();\n value = value.trim();\n styles[name.toLowerCase()] = value;\n }\n return styles;\n }, {});\n return obj;\n }\n };\n\n Wrapper.prototype.switchTag = function(newTag) {\n var attributes, newNode;\n newTag = newTag.toUpperCase();\n if (this.node.tagName === newTag) {\n return this;\n }\n newNode = document.createElement(newTag);\n attributes = this.attributes();\n if (dom.VOID_TAGS[newTag] == null) {\n this.moveChildren(newNode);\n }\n this.replace(newNode);\n this.node = newNode;\n return this.attributes(attributes);\n };\n\n Wrapper.prototype.text = function(text) {\n if (text != null) {\n switch (this.node.nodeType) {\n case dom.ELEMENT_NODE:\n this.node.textContent = text;\n break;\n case dom.TEXT_NODE:\n this.node.data = text;\n }\n return this;\n } else {\n switch (this.node.nodeType) {\n case dom.ELEMENT_NODE:\n if (this.node.tagName === dom.DEFAULT_BREAK_TAG) {\n return \"\";\n }\n if (dom.EMBED_TAGS[this.node.tagName] != null) {\n return dom.EMBED_TEXT;\n }\n if (this.node.textContent != null) {\n return this.node.textContent;\n }\n return \"\";\n case dom.TEXT_NODE:\n return this.node.data || \"\";\n default:\n return \"\";\n }\n }\n };\n\n Wrapper.prototype.textNodes = function() {\n var textNode, textNodes, walker;\n walker = document.createTreeWalker(this.node, NodeFilter.SHOW_TEXT, null, false);\n textNodes = [];\n while (textNode = walker.nextNode()) {\n textNodes.push(textNode);\n }\n return textNodes;\n };\n\n Wrapper.prototype.toggleClass = function(className, state) {\n if (state == null) {\n state = !this.hasClass(className);\n }\n if (state) {\n this.addClass(className);\n } else {\n this.removeClass(className);\n }\n return this;\n };\n\n Wrapper.prototype.trigger = function(eventName, options) {\n var event, initFn, modifiers;\n if (options == null) {\n options = {};\n }\n if (['keypress', 'keydown', 'keyup'].indexOf(eventName) < 0) {\n event = document.createEvent('Event');\n event.initEvent(eventName, options.bubbles, options.cancelable);\n } else {\n event = document.createEvent('KeyboardEvent');\n lastKeyEvent = _.clone(options);\n if (_.isNumber(options.key)) {\n lastKeyEvent.which = options.key;\n } else if (_.isString(options.key)) {\n lastKeyEvent.which = options.key.toUpperCase().charCodeAt(0);\n } else {\n lastKeyEvent.which = 0;\n }\n if (dom.isIE(10)) {\n modifiers = [];\n if (options.altKey) {\n modifiers.push('Alt');\n }\n if (options.ctrlKey) {\n modifiers.push('Control');\n }\n if (options.metaKey) {\n modifiers.push('Meta');\n }\n if (options.shiftKey) {\n modifiers.push('Shift');\n }\n event.initKeyboardEvent(eventName, options.bubbles, options.cancelable, window, 0, 0, modifiers.join(' '), null, null);\n } else {\n initFn = _.isFunction(event.initKeyboardEvent) ? 'initKeyboardEvent' : 'initKeyEvent';\n event[initFn](eventName, options.bubbles, options.cancelable, window, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, 0);\n }\n }\n this.node.dispatchEvent(event);\n lastKeyEvent = null;\n return this;\n };\n\n Wrapper.prototype.unwrap = function() {\n var next, ret;\n ret = this.node.firstChild;\n next = this.node.nextSibling;\n _.each(this.childNodes(), (function(_this) {\n return function(child) {\n return _this.node.parentNode.insertBefore(child, next);\n };\n })(this));\n this.remove();\n return ret;\n };\n\n Wrapper.prototype.wrap = function(wrapper) {\n var parent;\n if (this.node.parentNode != null) {\n this.node.parentNode.insertBefore(wrapper, this.node);\n }\n parent = wrapper;\n while (parent.firstChild != null) {\n parent = wrapper.firstChild;\n }\n parent.appendChild(this.node);\n return this;\n };\n\n return Wrapper;\n\n})();\n\nSelectWrapper = (function(superClass) {\n extend(SelectWrapper, superClass);\n\n function SelectWrapper() {\n return SelectWrapper.__super__.constructor.apply(this, arguments);\n }\n\n SelectWrapper.prototype[\"default\"] = function() {\n return this.node.querySelector('option[selected]');\n };\n\n SelectWrapper.prototype.option = function(option, trigger) {\n var child, i, j, len, ref, value;\n if (trigger == null) {\n trigger = true;\n }\n value = _.isElement(option) ? option.value : option;\n if (value) {\n value = value.replace(/[^\\w]+/g, '');\n ref = this.node.children;\n for (i = j = 0, len = ref.length; j < len; i = ++j) {\n child = ref[i];\n if (child.value.replace(/[^\\w]+/g, '') === value) {\n this.node.selectedIndex = i;\n break;\n }\n }\n } else {\n this.node.selectedIndex = -1;\n }\n if (trigger) {\n this.trigger('change');\n }\n return this;\n };\n\n SelectWrapper.prototype.reset = function(trigger) {\n var option;\n if (trigger == null) {\n trigger = true;\n }\n option = this[\"default\"]();\n if (option != null) {\n option.selected = true;\n } else {\n this.node.selectedIndex = 0;\n }\n if (trigger) {\n this.trigger('change');\n }\n return this;\n };\n\n SelectWrapper.prototype.value = function() {\n if (this.node.selectedIndex > -1) {\n return this.node.options[this.node.selectedIndex].value;\n } else {\n return '';\n }\n };\n\n return SelectWrapper;\n\n})(Wrapper);\n\ndom = function(node) {\n if ((node != null ? node.tagName : void 0) === 'SELECT') {\n return new SelectWrapper(node);\n } else {\n return new Wrapper(node);\n }\n};\n\ndom = _.extend(dom, {\n ELEMENT_NODE: 1,\n NOBREAK_SPACE: \" \",\n TEXT_NODE: 3,\n ZERO_WIDTH_NOBREAK_SPACE: \"\\uFEFF\",\n DEFAULT_BLOCK_TAG: 'DIV',\n DEFAULT_BREAK_TAG: 'BR',\n DEFAULT_INLINE_TAG: 'SPAN',\n EMBED_TEXT: '!',\n FONT_SIZES: {\n '10px': 1,\n '13px': 2,\n '16px': 3,\n '18px': 4,\n '24px': 5,\n '32px': 6,\n '48px': 7\n },\n KEYS: {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESCAPE: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n DELETE: 46\n },\n BLOCK_TAGS: {\n 'ADDRESS': 'ADDRESS',\n 'ARTICLE': 'ARTICLE',\n 'ASIDE': 'ASIDE',\n 'AUDIO': 'AUDIO',\n 'BLOCKQUOTE': 'BLOCKQUOTE',\n 'CANVAS': 'CANVAS',\n 'DD': 'DD',\n 'DIV': 'DIV',\n 'DL': 'DL',\n 'FIGCAPTION': 'FIGCAPTION',\n 'FIGURE': 'FIGURE',\n 'FOOTER': 'FOOTER',\n 'FORM': 'FORM',\n 'H1': 'H1',\n 'H2': 'H2',\n 'H3': 'H3',\n 'H4': 'H4',\n 'H5': 'H5',\n 'H6': 'H6',\n 'HEADER': 'HEADER',\n 'HGROUP': 'HGROUP',\n 'LI': 'LI',\n 'OL': 'OL',\n 'OUTPUT': 'OUTPUT',\n 'P': 'P',\n 'PRE': 'PRE',\n 'SECTION': 'SECTION',\n 'TABLE': 'TABLE',\n 'TBODY': 'TBODY',\n 'TD': 'TD',\n 'TFOOT': 'TFOOT',\n 'TH': 'TH',\n 'THEAD': 'THEAD',\n 'TR': 'TR',\n 'UL': 'UL',\n 'VIDEO': 'VIDEO'\n },\n EMBED_TAGS: {\n 'IMG': 'IMG'\n },\n LINE_TAGS: {\n 'DIV': 'DIV',\n 'LI': 'LI'\n },\n LIST_TAGS: {\n 'OL': 'OL',\n 'UL': 'UL'\n },\n VOID_TAGS: {\n 'AREA': 'AREA',\n 'BASE': 'BASE',\n 'BR': 'BR',\n 'COL': 'COL',\n 'COMMAND': 'COMMAND',\n 'EMBED': 'EMBED',\n 'HR': 'HR',\n 'IMG': 'IMG',\n 'INPUT': 'INPUT',\n 'KEYGEN': 'KEYGEN',\n 'LINK': 'LINK',\n 'META': 'META',\n 'PARAM': 'PARAM',\n 'SOURCE': 'SOURCE',\n 'TRACK': 'TRACK',\n 'WBR': 'WBR'\n },\n convertFontSize: function(size) {\n var i, s, sources, targets;\n if (_.isString(size) && size.indexOf('px') > -1) {\n sources = Object.keys(dom.FONT_SIZES);\n targets = _.values(dom.FONT_SIZES);\n } else {\n targets = Object.keys(dom.FONT_SIZES);\n sources = _.values(dom.FONT_SIZES);\n }\n for (i in sources) {\n s = sources[i];\n if (parseInt(size) <= parseInt(s)) {\n return targets[i];\n }\n }\n return _.last(targets);\n },\n isIE: function(maxVersion) {\n var version;\n version = document.documentMode;\n return version && maxVersion >= version;\n },\n isIOS: function() {\n return /iPhone|iPad/i.test(navigator.userAgent);\n },\n isMac: function() {\n return /Mac/i.test(navigator.platform);\n }\n});\n\nmodule.exports = dom;\n\n\n},{\"lodash\":1}],18:[function(_dereq_,module,exports){\nvar LinkedList, Node;\n\nNode = (function() {\n function Node(data) {\n this.data = data;\n this.prev = this.next = null;\n }\n\n return Node;\n\n})();\n\nLinkedList = (function() {\n LinkedList.Node = Node;\n\n function LinkedList() {\n this.length = 0;\n this.first = this.last = null;\n }\n\n LinkedList.prototype.append = function(node) {\n if (this.first != null) {\n node.next = null;\n this.last.next = node;\n } else {\n this.first = node;\n }\n node.prev = this.last;\n this.last = node;\n return this.length += 1;\n };\n\n LinkedList.prototype.insertAfter = function(refNode, newNode) {\n newNode.prev = refNode;\n if (refNode != null) {\n newNode.next = refNode.next;\n if (refNode.next != null) {\n refNode.next.prev = newNode;\n }\n refNode.next = newNode;\n if (refNode === this.last) {\n this.last = newNode;\n }\n } else {\n newNode.next = this.first;\n this.first.prev = newNode;\n this.first = newNode;\n }\n return this.length += 1;\n };\n\n LinkedList.prototype.remove = function(node) {\n if (this.length > 1) {\n if (node.prev != null) {\n node.prev.next = node.next;\n }\n if (node.next != null) {\n node.next.prev = node.prev;\n }\n if (node === this.first) {\n this.first = node.next;\n }\n if (node === this.last) {\n this.last = node.prev;\n }\n } else {\n this.first = this.last = null;\n }\n node.prev = node.next = null;\n return this.length -= 1;\n };\n\n LinkedList.prototype.toArray = function() {\n var arr, cur;\n arr = [];\n cur = this.first;\n while (cur != null) {\n arr.push(cur);\n cur = cur.next;\n }\n return arr;\n };\n\n return LinkedList;\n\n})();\n\nmodule.exports = LinkedList;\n\n\n},{}],19:[function(_dereq_,module,exports){\nvar Picker, _, dom;\n\n_ = _dereq_('lodash');\n\ndom = _dereq_('./dom');\n\nPicker = (function() {\n Picker.TEMPLATE = '<span class=\"ql-picker-label\"></span><span class=\"ql-picker-options\"></span>';\n\n function Picker(select) {\n this.select = select;\n this.container = document.createElement('span');\n this.buildPicker();\n dom(this.container).addClass('ql-picker');\n this.select.style.display = 'none';\n this.select.parentNode.insertBefore(this.container, this.select);\n dom(document).on('click', (function(_this) {\n return function() {\n _this.close();\n return true;\n };\n })(this));\n dom(this.label).on('click', (function(_this) {\n return function() {\n _.defer(function() {\n return dom(_this.container).toggleClass('ql-expanded');\n });\n return false;\n };\n })(this));\n dom(this.select).on('change', (function(_this) {\n return function() {\n var item, option;\n if (_this.select.selectedIndex > -1) {\n item = _this.container.querySelectorAll('.ql-picker-item')[_this.select.selectedIndex];\n option = _this.select.options[_this.select.selectedIndex];\n }\n _this.selectItem(item, false);\n return dom(_this.label).toggleClass('ql-active', option !== dom(_this.select)[\"default\"]());\n };\n })(this));\n }\n\n Picker.prototype.buildItem = function(picker, option, index) {\n var item;\n item = document.createElement('span');\n item.setAttribute('data-value', option.getAttribute('value'));\n dom(item).addClass('ql-picker-item').text(dom(option).text()).on('click', (function(_this) {\n return function() {\n _this.selectItem(item, true);\n return _this.close();\n };\n })(this));\n if (this.select.selectedIndex === index) {\n this.selectItem(item, false);\n }\n return item;\n };\n\n Picker.prototype.buildPicker = function() {\n var picker;\n _.each(dom(this.select).attributes(), (function(_this) {\n return function(value, name) {\n return _this.container.setAttribute(name, value);\n };\n })(this));\n this.container.innerHTML = Picker.TEMPLATE;\n this.label = this.container.querySelector('.ql-picker-label');\n picker = this.container.querySelector('.ql-picker-options');\n return _.each(this.select.options, (function(_this) {\n return function(option, i) {\n var item;\n item = _this.buildItem(picker, option, i);\n return picker.appendChild(item);\n };\n })(this));\n };\n\n Picker.prototype.close = function() {\n return dom(this.container).removeClass('ql-expanded');\n };\n\n Picker.prototype.selectItem = function(item, trigger) {\n var selected, value;\n selected = this.container.querySelector('.ql-selected');\n if (selected != null) {\n dom(selected).removeClass('ql-selected');\n }\n if (item != null) {\n value = item.getAttribute('data-value');\n dom(item).addClass('ql-selected');\n dom(this.label).text(dom(item).text());\n dom(this.select).option(value, trigger);\n return this.label.setAttribute('data-value', value);\n } else {\n this.label.innerHTML = ' ';\n return this.label.removeAttribute('data-value');\n }\n };\n\n return Picker;\n\n})();\n\nmodule.exports = Picker;\n\n\n},{\"./dom\":17,\"lodash\":1}],20:[function(_dereq_,module,exports){\nvar Range, _;\n\n_ = _dereq_('lodash');\n\nRange = (function() {\n Range.compare = function(r1, r2) {\n if (r1 === r2) {\n return true;\n }\n if (!((r1 != null) && (r2 != null))) {\n return false;\n }\n return r1.equals(r2);\n };\n\n function Range(start, end) {\n this.start = start;\n this.end = end;\n }\n\n Range.prototype.equals = function(range) {\n if (range == null) {\n return false;\n }\n return this.start === range.start && this.end === range.end;\n };\n\n Range.prototype.shift = function(index, length) {\n var ref;\n return ref = _.map([this.start, this.end], function(pos) {\n if (index > pos) {\n return pos;\n }\n if (length >= 0) {\n return pos + length;\n } else {\n return Math.max(index, pos + length);\n }\n }), this.start = ref[0], this.end = ref[1], ref;\n };\n\n Range.prototype.isCollapsed = function() {\n return this.start === this.end;\n };\n\n return Range;\n\n})();\n\nmodule.exports = Range;\n\n\n},{\"lodash\":1}],21:[function(_dereq_,module,exports){\nvar Authorship, Delta, Quill, _, dom;\n\nQuill = _dereq_('../quill');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nDelta = Quill.require('delta');\n\nAuthorship = (function() {\n Authorship.DEFAULTS = {\n authorId: null,\n color: 'transparent',\n enabled: false\n };\n\n function Authorship(quill, options) {\n this.quill = quill;\n this.options = options;\n if (this.options.button != null) {\n this.attachButton(this.options.button);\n }\n if (this.options.enabled) {\n this.enable();\n }\n this.quill.addFormat('author', {\n \"class\": 'author-'\n });\n if (this.options.authorId == null) {\n return;\n }\n this.quill.on(this.quill.constructor.events.PRE_EVENT, (function(_this) {\n return function(eventName, delta, origin) {\n var authorDelta, authorFormat;\n if (eventName === _this.quill.constructor.events.TEXT_CHANGE && origin === 'user') {\n authorDelta = new Delta();\n authorFormat = {\n author: _this.options.authorId\n };\n _.each(delta.ops, function(op) {\n if (op[\"delete\"] != null) {\n return;\n }\n if ((op.insert != null) || ((op.retain != null) && (op.attributes != null))) {\n op.attributes || (op.attributes = {});\n op.attributes.author = _this.options.authorId;\n return authorDelta.retain(op.retain || op.insert.length || 1, authorFormat);\n } else {\n return authorDelta.retain(op.retain);\n }\n });\n return _this.quill.updateContents(authorDelta, Quill.sources.SILENT);\n }\n };\n })(this));\n this.addAuthor(this.options.authorId, this.options.color);\n }\n\n Authorship.prototype.addAuthor = function(id, color) {\n var styles;\n styles = {};\n styles[\".authorship .author-\" + id] = {\n \"background-color\": \"\" + color\n };\n return this.quill.theme.addStyles(styles);\n };\n\n Authorship.prototype.attachButton = function(button) {\n var $button;\n $button = dom(button);\n return $button.on('click', (function(_this) {\n return function() {\n $button.toggleClass('ql-on');\n return _this.enable($dom.hasClass('ql-on'));\n };\n })(this));\n };\n\n Authorship.prototype.enable = function(enabled) {\n if (enabled == null) {\n enabled = true;\n }\n return dom(this.quill.root).toggleClass('authorship', enabled);\n };\n\n Authorship.prototype.disable = function() {\n return this.enable(false);\n };\n\n return Authorship;\n\n})();\n\nQuill.registerModule('authorship', Authorship);\n\nmodule.exports = Authorship;\n\n\n},{\"../quill\":30}],22:[function(_dereq_,module,exports){\nvar Delta, ImageTooltip, Quill, Range, Tooltip, _, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nQuill = _dereq_('../quill');\n\nTooltip = _dereq_('./tooltip');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nDelta = Quill.require('delta');\n\nRange = Quill.require('range');\n\nImageTooltip = (function(superClass) {\n extend(ImageTooltip, superClass);\n\n ImageTooltip.DEFAULTS = {\n template: '<input class=\"input\" type=\"textbox\"> <div class=\"preview\"> <span>Preview</span> </div> <a href=\"javascript:;\" class=\"cancel\">Cancel</a> <a href=\"javascript:;\" class=\"insert\">Insert</a>'\n };\n\n function ImageTooltip(quill, options) {\n this.quill = quill;\n this.options = options;\n this.options = _.defaults(this.options, Tooltip.DEFAULTS);\n ImageTooltip.__super__.constructor.call(this, this.quill, this.options);\n this.preview = this.container.querySelector('.preview');\n this.textbox = this.container.querySelector('.input');\n dom(this.container).addClass('ql-image-tooltip');\n this.initListeners();\n }\n\n ImageTooltip.prototype.initListeners = function() {\n dom(this.quill.root).on('focus', _.bind(this.hide, this));\n dom(this.container.querySelector('.insert')).on('click', _.bind(this.insertImage, this));\n dom(this.container.querySelector('.cancel')).on('click', _.bind(this.hide, this));\n dom(this.textbox).on('input', _.bind(this._preview, this));\n this.initTextbox(this.textbox, this.insertImage, this.hide);\n return this.quill.onModuleLoad('toolbar', (function(_this) {\n return function(toolbar) {\n _this.toolbar = toolbar;\n return toolbar.initFormat('image', _.bind(_this._onToolbar, _this));\n };\n })(this));\n };\n\n ImageTooltip.prototype.insertImage = function() {\n var index, url;\n url = this._normalizeURL(this.textbox.value);\n if (this.range == null) {\n this.range = new Range(0, 0);\n }\n if (this.range) {\n this.preview.innerHTML = '<span>Preview</span>';\n this.textbox.value = '';\n index = this.range.end;\n this.quill.insertEmbed(index, 'image', url, 'user');\n this.quill.setSelection(index + 1, index + 1);\n }\n return this.hide();\n };\n\n ImageTooltip.prototype._onToolbar = function(range, value) {\n if (value) {\n if (!this.textbox.value) {\n this.textbox.value = 'http://';\n }\n this.show();\n this.textbox.focus();\n return _.defer((function(_this) {\n return function() {\n return _this.textbox.setSelectionRange(_this.textbox.value.length, _this.textbox.value.length);\n };\n })(this));\n } else {\n this.quill.deleteText(range, 'user');\n return this.toolbar.setActive('image', false);\n }\n };\n\n ImageTooltip.prototype._preview = function() {\n var img;\n if (!this._matchImageURL(this.textbox.value)) {\n return;\n }\n if (this.preview.firstChild.tagName === 'IMG') {\n return this.preview.firstChild.setAttribute('src', this.textbox.value);\n } else {\n img = document.createElement('img');\n img.setAttribute('src', this.textbox.value);\n return this.preview.replaceChild(img, this.preview.firstChild);\n }\n };\n\n ImageTooltip.prototype._matchImageURL = function(url) {\n return /^https?:\\/\\/.+\\.(jpe?g|gif|png)$/.test(url);\n };\n\n ImageTooltip.prototype._normalizeURL = function(url) {\n if (!/^https?:\\/\\//.test(url)) {\n url = 'http://' + url;\n }\n return url;\n };\n\n return ImageTooltip;\n\n})(Tooltip);\n\nQuill.registerModule('image-tooltip', ImageTooltip);\n\nmodule.exports = ImageTooltip;\n\n\n},{\"../quill\":30,\"./tooltip\":28}],23:[function(_dereq_,module,exports){\nvar Delta, Keyboard, Quill, _, dom;\n\nQuill = _dereq_('../quill');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nDelta = Quill.require('delta');\n\nKeyboard = (function() {\n Keyboard.hotkeys = {\n BOLD: {\n key: 'B',\n metaKey: true\n },\n INDENT: {\n key: dom.KEYS.TAB\n },\n ITALIC: {\n key: 'I',\n metaKey: true\n },\n OUTDENT: {\n key: dom.KEYS.TAB,\n shiftKey: true\n },\n UNDERLINE: {\n key: 'U',\n metaKey: true\n }\n };\n\n function Keyboard(quill, options) {\n this.quill = quill;\n this.hotkeys = {};\n this._initListeners();\n this._initHotkeys();\n this.quill.onModuleLoad('toolbar', (function(_this) {\n return function(toolbar) {\n return _this.toolbar = toolbar;\n };\n })(this));\n }\n\n Keyboard.prototype.addHotkey = function(hotkeys, callback) {\n if (!Array.isArray(hotkeys)) {\n hotkeys = [hotkeys];\n }\n return _.each(hotkeys, (function(_this) {\n return function(hotkey) {\n var base, which;\n hotkey = _.isObject(hotkey) ? _.clone(hotkey) : {\n key: hotkey\n };\n hotkey.callback = callback;\n which = _.isNumber(hotkey.key) ? hotkey.key : hotkey.key.toUpperCase().charCodeAt(0);\n if ((base = _this.hotkeys)[which] == null) {\n base[which] = [];\n }\n return _this.hotkeys[which].push(hotkey);\n };\n })(this));\n };\n\n Keyboard.prototype.removeHotkeys = function(hotkey, callback) {\n var base, kept, ref, removed, which;\n hotkey = _.isString(hotkey) ? hotkey.toUpperCase() : hotkey;\n hotkey = Keyboard.hotkeys[hotkey] ? Keyboard.hotkeys[hotkey] : hotkey;\n hotkey = _.isObject(hotkey) ? hotkey : {\n key: hotkey\n };\n which = _.isNumber(hotkey.key) ? hotkey.key : hotkey.key.charCodeAt(0);\n if ((base = this.hotkeys)[which] == null) {\n base[which] = [];\n }\n ref = _.partition(this.hotkeys[which], function(handler) {\n return _.isEqual(hotkey, _.omit(handler, 'callback')) && (!callback || callback === handler.callback);\n }), removed = ref[0], kept = ref[1];\n this.hotkeys[which] = kept;\n return _.map(removed, 'callback');\n };\n\n Keyboard.prototype.toggleFormat = function(range, format) {\n var delta, value;\n if (range.isCollapsed()) {\n delta = this.quill.getContents(Math.max(0, range.start - 1), range.end);\n } else {\n delta = this.quill.getContents(range);\n }\n value = delta.ops.length === 0 || !_.all(delta.ops, function(op) {\n var ref;\n return (ref = op.attributes) != null ? ref[format] : void 0;\n });\n if (range.isCollapsed()) {\n this.quill.prepareFormat(format, value, Quill.sources.USER);\n } else {\n this.quill.formatText(range, format, value, Quill.sources.USER);\n }\n if (this.toolbar != null) {\n return this.toolbar.setActive(format, value);\n }\n };\n\n Keyboard.prototype._initEnter = function() {\n var keys;\n keys = [\n {\n key: dom.KEYS.ENTER\n }, {\n key: dom.KEYS.ENTER,\n shiftKey: true\n }\n ];\n return this.addHotkey(keys, (function(_this) {\n return function(range, hotkey) {\n var delta, leaf, line, offset, ref, ref1;\n if (range == null) {\n return true;\n }\n ref = _this.quill.editor.doc.findLineAt(range.start), line = ref[0], offset = ref[1];\n ref1 = line.findLeafAt(offset), leaf = ref1[0], offset = ref1[1];\n delta = new Delta().retain(range.start).insert('\\n', line.formats)[\"delete\"](range.end - range.start);\n _this.quill.updateContents(delta, Quill.sources.USER);\n _.each(leaf.formats, function(value, format) {\n _this.quill.prepareFormat(format, value);\n if (_this.toolbar != null) {\n _this.toolbar.setActive(format, value);\n }\n });\n _this.quill.editor.selection.scrollIntoView();\n return false;\n };\n })(this));\n };\n\n Keyboard.prototype._initDeletes = function() {\n return this.addHotkey([dom.KEYS.DELETE, dom.KEYS.BACKSPACE], (function(_this) {\n return function(range, hotkey) {\n var format, line, offset, ref;\n if ((range != null) && _this.quill.getLength() > 0) {\n if (range.start !== range.end) {\n _this.quill.deleteText(range.start, range.end, Quill.sources.USER);\n } else {\n if (hotkey.key === dom.KEYS.BACKSPACE) {\n ref = _this.quill.editor.doc.findLineAt(range.start), line = ref[0], offset = ref[1];\n if (offset === 0 && (line.formats.bullet || line.formats.list)) {\n format = line.formats.bullet ? 'bullet' : 'list';\n _this.quill.formatLine(range.start, range.start, format, false, Quill.sources.USER);\n } else if (range.start > 0) {\n _this.quill.deleteText(range.start - 1, range.start, Quill.sources.USER);\n }\n } else if (range.start < _this.quill.getLength() - 1) {\n _this.quill.deleteText(range.start, range.start + 1, Quill.sources.USER);\n }\n }\n }\n _this.quill.editor.selection.scrollIntoView();\n return false;\n };\n })(this));\n };\n\n Keyboard.prototype._initHotkeys = function() {\n this.addHotkey(Keyboard.hotkeys.INDENT, (function(_this) {\n return function(range) {\n _this._onTab(range, false);\n return false;\n };\n })(this));\n this.addHotkey(Keyboard.hotkeys.OUTDENT, (function(_this) {\n return function(range) {\n return false;\n };\n })(this));\n _.each(['bold', 'italic', 'underline'], (function(_this) {\n return function(format) {\n return _this.addHotkey(Keyboard.hotkeys[format.toUpperCase()], function(range) {\n if (_this.quill.editor.doc.formats[format]) {\n _this.toggleFormat(range, format);\n }\n return false;\n });\n };\n })(this));\n this._initDeletes();\n return this._initEnter();\n };\n\n Keyboard.prototype._initListeners = function() {\n return dom(this.quill.root).on('keydown', (function(_this) {\n return function(event) {\n var prevent;\n prevent = false;\n _.each(_this.hotkeys[event.which], function(hotkey) {\n var metaKey;\n metaKey = dom.isMac() ? event.metaKey : event.metaKey || event.ctrlKey;\n if (!!hotkey.metaKey !== !!metaKey) {\n return;\n }\n if (!!hotkey.shiftKey !== !!event.shiftKey) {\n return;\n }\n if (!!hotkey.altKey !== !!event.altKey) {\n return;\n }\n prevent = hotkey.callback(_this.quill.getSelection(), hotkey, event) === false || prevent;\n return true;\n });\n return !prevent;\n };\n })(this));\n };\n\n Keyboard.prototype._onTab = function(range, shift) {\n var delta;\n if (shift == null) {\n shift = false;\n }\n delta = new Delta().retain(range.start).insert(\"\\t\")[\"delete\"](range.end - range.start).retain(this.quill.getLength() - range.end);\n this.quill.updateContents(delta, Quill.sources.USER);\n return this.quill.setSelection(range.start + 1, range.start + 1);\n };\n\n return Keyboard;\n\n})();\n\nQuill.registerModule('keyboard', Keyboard);\n\nmodule.exports = Keyboard;\n\n\n},{\"../quill\":30}],24:[function(_dereq_,module,exports){\nvar LinkTooltip, Quill, Tooltip, _, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nQuill = _dereq_('../quill');\n\nTooltip = _dereq_('./tooltip');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nLinkTooltip = (function(superClass) {\n extend(LinkTooltip, superClass);\n\n LinkTooltip.DEFAULTS = {\n maxLength: 50,\n template: '<span class=\"title\">Visit URL: </span> <a href=\"#\" class=\"url\" target=\"_blank\" href=\"about:blank\"></a> <input class=\"input\" type=\"text\"> <span> - </span> <a href=\"javascript:;\" class=\"change\">Change</a> <a href=\"javascript:;\" class=\"remove\">Remove</a> <a href=\"javascript:;\" class=\"done\">Done</a>'\n };\n\n LinkTooltip.hotkeys = {\n LINK: {\n key: 'K',\n metaKey: true\n }\n };\n\n function LinkTooltip(quill, options) {\n this.quill = quill;\n this.options = options;\n this.options = _.defaults(this.options, Tooltip.DEFAULTS);\n LinkTooltip.__super__.constructor.call(this, this.quill, this.options);\n dom(this.container).addClass('ql-link-tooltip');\n this.textbox = this.container.querySelector('.input');\n this.link = this.container.querySelector('.url');\n this.initListeners();\n }\n\n LinkTooltip.prototype.initListeners = function() {\n this.quill.on(this.quill.constructor.events.SELECTION_CHANGE, (function(_this) {\n return function(range) {\n var anchor;\n if (!((range != null) && range.isCollapsed())) {\n return;\n }\n anchor = _this._findAnchor(range);\n if (anchor) {\n _this.setMode(anchor.href, false);\n return _this.show(anchor);\n } else if (_this.container.style.left !== Tooltip.HIDE_MARGIN) {\n _this.range = null;\n return _this.hide();\n }\n };\n })(this));\n dom(this.container.querySelector('.done')).on('click', _.bind(this.saveLink, this));\n dom(this.container.querySelector('.remove')).on('click', (function(_this) {\n return function() {\n return _this.removeLink(_this.range);\n };\n })(this));\n dom(this.container.querySelector('.change')).on('click', (function(_this) {\n return function() {\n return _this.setMode(_this.link.href, true);\n };\n })(this));\n this.initTextbox(this.textbox, this.saveLink, this.hide);\n this.quill.onModuleLoad('toolbar', (function(_this) {\n return function(toolbar) {\n _this.toolbar = toolbar;\n return toolbar.initFormat('link', _.bind(_this._onToolbar, _this));\n };\n })(this));\n return this.quill.onModuleLoad('keyboard', (function(_this) {\n return function(keyboard) {\n return keyboard.addHotkey(LinkTooltip.hotkeys.LINK, _.bind(_this._onKeyboard, _this));\n };\n })(this));\n };\n\n LinkTooltip.prototype.saveLink = function() {\n var anchor, end, url;\n url = this._normalizeURL(this.textbox.value);\n if (this.range != null) {\n end = this.range.end;\n if (this.range.isCollapsed()) {\n anchor = this._findAnchor(this.range);\n if (anchor != null) {\n anchor.href = url;\n }\n } else {\n this.quill.formatText(this.range, 'link', url, 'user');\n }\n this.quill.setSelection(end, end);\n }\n return this.setMode(url, false);\n };\n\n LinkTooltip.prototype.removeLink = function(range) {\n if (range.isCollapsed()) {\n range = this._expandRange(range);\n }\n this.hide();\n this.quill.formatText(range, 'link', false, 'user');\n if (this.toolbar != null) {\n return this.toolbar.setActive('link', false);\n }\n };\n\n LinkTooltip.prototype.setMode = function(url, edit) {\n var text;\n if (edit == null) {\n edit = false;\n }\n if (edit) {\n this.textbox.value = url;\n _.defer((function(_this) {\n return function() {\n _this.textbox.focus();\n return _this.textbox.setSelectionRange(0, url.length);\n };\n })(this));\n } else {\n this.link.href = url;\n url = this.link.href;\n text = url.length > this.options.maxLength ? url.slice(0, this.options.maxLength) + '...' : url;\n dom(this.link).text(text);\n }\n return dom(this.container).toggleClass('editing', edit);\n };\n\n LinkTooltip.prototype._findAnchor = function(range) {\n var leaf, node, offset, ref;\n ref = this.quill.editor.doc.findLeafAt(range.start, true), leaf = ref[0], offset = ref[1];\n if (leaf != null) {\n node = leaf.node;\n }\n while ((node != null) && node !== this.quill.root) {\n if (node.tagName === 'A') {\n return node;\n }\n node = node.parentNode;\n }\n return null;\n };\n\n LinkTooltip.prototype._expandRange = function(range) {\n var end, leaf, offset, ref, start;\n ref = this.quill.editor.doc.findLeafAt(range.start, true), leaf = ref[0], offset = ref[1];\n start = range.start - offset;\n end = start + leaf.length;\n return {\n start: start,\n end: end\n };\n };\n\n LinkTooltip.prototype._onToolbar = function(range, value) {\n return this._toggle(range, value);\n };\n\n LinkTooltip.prototype._onKeyboard = function() {\n var range;\n range = this.quill.getSelection();\n return this._toggle(range, !this._findAnchor(range));\n };\n\n LinkTooltip.prototype._toggle = function(range, value) {\n var nativeRange;\n if (!range) {\n return;\n }\n if (!value) {\n return this.removeLink(range);\n } else if (!range.isCollapsed()) {\n this.setMode(this._suggestURL(range), true);\n nativeRange = this.quill.editor.selection._getNativeRange();\n return this.show(nativeRange);\n }\n };\n\n LinkTooltip.prototype._normalizeURL = function(url) {\n if (!/^(https?:\\/\\/|mailto:)/.test(url)) {\n url = 'http://' + url;\n }\n return url;\n };\n\n LinkTooltip.prototype._suggestURL = function(range) {\n var text;\n text = this.quill.getText(range);\n return this._normalizeURL(text);\n };\n\n return LinkTooltip;\n\n})(Tooltip);\n\nQuill.registerModule('link-tooltip', LinkTooltip);\n\nmodule.exports = LinkTooltip;\n\n\n},{\"../quill\":30,\"./tooltip\":28}],25:[function(_dereq_,module,exports){\nvar EventEmitter2, MultiCursor, Quill, _, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nQuill = _dereq_('../quill');\n\nEventEmitter2 = _dereq_('eventemitter2').EventEmitter2;\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nMultiCursor = (function(superClass) {\n extend(MultiCursor, superClass);\n\n MultiCursor.DEFAULTS = {\n template: '<span class=\"cursor-flag\"> <span class=\"cursor-name\"></span> </span> <span class=\"cursor-caret\"></span>',\n timeout: 2500\n };\n\n MultiCursor.events = {\n CURSOR_ADDED: 'cursor-addded',\n CURSOR_MOVED: 'cursor-moved',\n CURSOR_REMOVED: 'cursor-removed'\n };\n\n function MultiCursor(quill, options) {\n this.quill = quill;\n this.options = options;\n this.cursors = {};\n this.container = this.quill.addContainer('ql-multi-cursor', true);\n this.quill.on(this.quill.constructor.events.TEXT_CHANGE, _.bind(this._applyDelta, this));\n }\n\n MultiCursor.prototype.clearCursors = function() {\n _.each(Object.keys(this.cursors), _.bind(this.removeCursor, this));\n return this.cursors = {};\n };\n\n MultiCursor.prototype.moveCursor = function(userId, index) {\n var cursor;\n cursor = this.cursors[userId];\n if (cursor == null) {\n return;\n }\n cursor.index = index;\n dom(cursor.elem).removeClass('hidden');\n clearTimeout(cursor.timer);\n cursor.timer = setTimeout((function(_this) {\n return function() {\n dom(cursor.elem).addClass('hidden');\n return cursor.timer = null;\n };\n })(this), this.options.timeout);\n this._updateCursor(cursor);\n return cursor;\n };\n\n MultiCursor.prototype.removeCursor = function(userId) {\n var cursor;\n cursor = this.cursors[userId];\n this.emit(MultiCursor.events.CURSOR_REMOVED, cursor);\n if (cursor != null) {\n cursor.elem.parentNode.removeChild(cursor.elem);\n }\n return delete this.cursors[userId];\n };\n\n MultiCursor.prototype.setCursor = function(userId, index, name, color) {\n var cursor;\n if (this.cursors[userId] == null) {\n this.cursors[userId] = cursor = {\n userId: userId,\n index: index,\n color: color,\n elem: this._buildCursor(name, color)\n };\n this.emit(MultiCursor.events.CURSOR_ADDED, cursor);\n }\n _.defer((function(_this) {\n return function() {\n return _this.moveCursor(userId, index);\n };\n })(this));\n return this.cursors[userId];\n };\n\n MultiCursor.prototype.shiftCursors = function(index, length, authorId) {\n if (authorId == null) {\n authorId = null;\n }\n return _.each(this.cursors, (function(_this) {\n return function(cursor, id) {\n var shift;\n if (!cursor) {\n return;\n }\n shift = Math.max(length, index - cursor.index);\n if (cursor.userId === authorId) {\n return _this.moveCursor(authorId, cursor.index + shift);\n } else if (cursor.index > index) {\n return cursor.index += shift;\n }\n };\n })(this));\n };\n\n MultiCursor.prototype.update = function() {\n return _.each(this.cursors, (function(_this) {\n return function(cursor, id) {\n if (cursor == null) {\n return;\n }\n _this._updateCursor(cursor);\n return true;\n };\n })(this));\n };\n\n MultiCursor.prototype._applyDelta = function(delta) {\n var index;\n index = 0;\n _.each(delta.ops, (function(_this) {\n return function(op) {\n var length, ref;\n length = 0;\n if (op.insert != null) {\n length = op.insert.length || 1;\n _this.shiftCursors(index, length, (ref = op.attributes) != null ? ref['author'] : void 0);\n } else if (op[\"delete\"] != null) {\n _this.shiftCursors(index, -1 * op[\"delete\"], null);\n } else if (op.retain != null) {\n _this.shiftCursors(index, 0, null);\n length = op.retain;\n }\n return index += length;\n };\n })(this));\n return this.update();\n };\n\n MultiCursor.prototype._buildCursor = function(name, color) {\n var cursor, cursorCaret, cursorFlag, cursorName;\n cursor = document.createElement('span');\n dom(cursor).addClass('cursor');\n cursor.innerHTML = this.options.template;\n cursorFlag = cursor.querySelector('.cursor-flag');\n cursorName = cursor.querySelector('.cursor-name');\n dom(cursorName).text(name);\n cursorCaret = cursor.querySelector('.cursor-caret');\n cursorCaret.style.backgroundColor = cursorName.style.backgroundColor = color;\n this.container.appendChild(cursor);\n return cursor;\n };\n\n MultiCursor.prototype._updateCursor = function(cursor) {\n var bounds, flag;\n bounds = this.quill.getBounds(cursor.index);\n if (bounds == null) {\n return this.removeCursor(cursor.userId);\n }\n cursor.elem.style.top = (bounds.top + this.quill.container.scrollTop) + 'px';\n cursor.elem.style.left = bounds.left + 'px';\n cursor.elem.style.height = bounds.height + 'px';\n flag = cursor.elem.querySelector('.cursor-flag');\n dom(cursor.elem).toggleClass('top', parseInt(cursor.elem.style.top) <= flag.offsetHeight).toggleClass('left', parseInt(cursor.elem.style.left) <= flag.offsetWidth).toggleClass('right', this.quill.root.offsetWidth - parseInt(cursor.elem.style.left) <= flag.offsetWidth);\n return this.emit(MultiCursor.events.CURSOR_MOVED, cursor);\n };\n\n return MultiCursor;\n\n})(EventEmitter2);\n\nQuill.registerModule('multi-cursor', MultiCursor);\n\nmodule.exports = MultiCursor;\n\n\n},{\"../quill\":30,\"eventemitter2\":2}],26:[function(_dereq_,module,exports){\nvar Delta, Document, PasteManager, Quill, _, dom,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\nQuill = _dereq_('../quill');\n\nDocument = _dereq_('../core/document');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nDelta = Quill.require('delta');\n\nPasteManager = (function() {\n PasteManager.DEFAULTS = {\n onConvert: null\n };\n\n function PasteManager(quill, options) {\n var base;\n this.quill = quill;\n this._onConvert = bind(this._onConvert, this);\n this.container = this.quill.addContainer('ql-paste-manager');\n this.container.setAttribute('contenteditable', true);\n this.container.setAttribute('tabindex', '-1');\n dom(this.quill.root).on('paste', _.bind(this._paste, this));\n this.options = _.defaults(options, PasteManager.DEFAULTS);\n if ((base = this.options).onConvert == null) {\n base.onConvert = this._onConvert;\n }\n }\n\n PasteManager.prototype._onConvert = function(container) {\n var delta, doc, lengthAdded;\n doc = new Document(container, this.quill.options);\n delta = doc.toDelta();\n lengthAdded = delta.length();\n if (lengthAdded === 0) {\n return delta;\n }\n return delta.compose(new Delta().retain(lengthAdded - 1)[\"delete\"](1));\n };\n\n PasteManager.prototype._paste = function() {\n var oldDocLength, range;\n oldDocLength = this.quill.getLength();\n range = this.quill.getSelection();\n if (range == null) {\n return;\n }\n this.container.focus();\n return _.defer((function(_this) {\n return function() {\n var delta, lengthAdded;\n delta = _this.options.onConvert(_this.container);\n lengthAdded = delta.length();\n if (lengthAdded > 0) {\n if (range.start > 0) {\n delta.ops.unshift({\n retain: range.start\n });\n }\n delta[\"delete\"](range.end - range.start);\n _this.quill.updateContents(delta, 'user');\n }\n _this.quill.setSelection(range.start + lengthAdded, range.start + lengthAdded);\n _this.quill.editor.selection.scrollIntoView();\n return _this.container.innerHTML = \"\";\n };\n })(this));\n };\n\n return PasteManager;\n\n})();\n\nQuill.registerModule('paste-manager', PasteManager);\n\nmodule.exports = PasteManager;\n\n\n},{\"../core/document\":8,\"../quill\":30}],27:[function(_dereq_,module,exports){\nvar Quill, Toolbar, _, dom;\n\nQuill = _dereq_('../quill');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nToolbar = (function() {\n Toolbar.DEFAULTS = {\n container: null\n };\n\n Toolbar.formats = {\n LINE: {\n 'align': 'align',\n 'bullet': 'bullet',\n 'list': 'list'\n },\n SELECT: {\n 'align': 'align',\n 'background': 'background',\n 'color': 'color',\n 'font': 'font',\n 'size': 'size'\n },\n TOGGLE: {\n 'bold': 'bold',\n 'bullet': 'bullet',\n 'image': 'image',\n 'italic': 'italic',\n 'link': 'link',\n 'list': 'list',\n 'strike': 'strike',\n 'underline': 'underline'\n },\n TOOLTIP: {\n 'image': 'image',\n 'link': 'link'\n }\n };\n\n function Toolbar(quill, options) {\n this.quill = quill;\n this.options = options;\n if (_.isString(this.options) || _.isElement(this.options)) {\n this.options = {\n container: this.options\n };\n }\n if (this.options.container == null) {\n throw new Error('container required for toolbar', this.options);\n }\n this.container = _.isString(this.options.container) ? document.querySelector(this.options.container) : this.options.container;\n this.inputs = {};\n this.preventUpdate = false;\n this.triggering = false;\n _.each(this.quill.options.formats, (function(_this) {\n return function(name) {\n if (Toolbar.formats.TOOLTIP[name] != null) {\n return;\n }\n return _this.initFormat(name, _.bind(_this._applyFormat, _this, name));\n };\n })(this));\n this.quill.on(Quill.events.FORMAT_INIT, (function(_this) {\n return function(name) {\n if (Toolbar.formats.TOOLTIP[name] != null) {\n return;\n }\n return _this.initFormat(name, _.bind(_this._applyFormat, _this, name));\n };\n })(this));\n this.quill.on(Quill.events.SELECTION_CHANGE, (function(_this) {\n return function(range) {\n if (range != null) {\n return _this.updateActive(range);\n }\n };\n })(this));\n this.quill.on(Quill.events.TEXT_CHANGE, (function(_this) {\n return function() {\n return _this.updateActive();\n };\n })(this));\n this.quill.onModuleLoad('keyboard', (function(_this) {\n return function(keyboard) {\n return keyboard.addHotkey([dom.KEYS.BACKSPACE, dom.KEYS.DELETE], function() {\n return _.defer(_.bind(_this.updateActive, _this));\n });\n };\n })(this));\n dom(this.container).addClass('ql-toolbar');\n if (dom.isIOS()) {\n dom(this.container).addClass('ios');\n }\n }\n\n Toolbar.prototype.initFormat = function(format, callback) {\n var eventName, input, selector;\n selector = \".ql-\" + format;\n if (Toolbar.formats.SELECT[format] != null) {\n selector = \"select\" + selector;\n eventName = 'change';\n } else {\n eventName = 'click';\n }\n input = this.container.querySelector(selector);\n if (input == null) {\n return;\n }\n this.inputs[format] = input;\n return dom(input).on(eventName, (function(_this) {\n return function() {\n var range, value;\n value = eventName === 'change' ? dom(input).value() : !dom(input).hasClass('ql-active');\n _this.preventUpdate = true;\n _this.quill.focus();\n range = _this.quill.getSelection();\n if (range != null) {\n callback(range, value);\n }\n if (dom.isIE(11)) {\n _this.quill.editor.selection.scrollIntoView();\n }\n _this.preventUpdate = false;\n return false;\n };\n })(this));\n };\n\n Toolbar.prototype.setActive = function(format, value) {\n var $input, input, ref, selectValue;\n if (format === 'image') {\n value = false;\n }\n input = this.inputs[format];\n if (input == null) {\n return;\n }\n $input = dom(input);\n if (input.tagName === 'SELECT') {\n this.triggering = true;\n selectValue = $input.value(input);\n if (value == null) {\n value = (ref = $input[\"default\"]()) != null ? ref.value : void 0;\n }\n if (Array.isArray(value)) {\n value = '';\n }\n if (value !== selectValue) {\n if (value != null) {\n $input.option(value);\n } else {\n $input.reset();\n }\n }\n return this.triggering = false;\n } else {\n return $input.toggleClass('ql-active', value || false);\n }\n };\n\n Toolbar.prototype.updateActive = function(range, formats) {\n var activeFormats;\n if (formats == null) {\n formats = null;\n }\n range || (range = this.quill.getSelection());\n if (!((range != null) && !this.preventUpdate)) {\n return;\n }\n activeFormats = this._getActive(range);\n return _.each(this.inputs, (function(_this) {\n return function(input, format) {\n if (!Array.isArray(formats) || formats.indexOf(format) > -1) {\n _this.setActive(format, activeFormats[format]);\n }\n return true;\n };\n })(this));\n };\n\n Toolbar.prototype._applyFormat = function(format, range, value) {\n if (this.triggering) {\n return;\n }\n if (range.isCollapsed()) {\n this.quill.prepareFormat(format, value, 'user');\n } else if (Toolbar.formats.LINE[format] != null) {\n this.quill.formatLine(range, format, value, 'user');\n } else {\n this.quill.formatText(range, format, value, 'user');\n }\n return _.defer((function(_this) {\n return function() {\n _this.updateActive(range, ['bullet', 'list']);\n return _this.setActive(format, value);\n };\n })(this));\n };\n\n Toolbar.prototype._getActive = function(range) {\n var leafFormats, lineFormats;\n leafFormats = this._getLeafActive(range);\n lineFormats = this._getLineActive(range);\n return _.defaults({}, leafFormats, lineFormats);\n };\n\n Toolbar.prototype._getLeafActive = function(range) {\n var contents, formatsArr, line, offset, ref;\n if (range.isCollapsed()) {\n ref = this.quill.editor.doc.findLineAt(range.start), line = ref[0], offset = ref[1];\n if (offset === 0) {\n contents = this.quill.getContents(range.start, range.end + 1);\n } else {\n contents = this.quill.getContents(range.start - 1, range.end);\n }\n } else {\n contents = this.quill.getContents(range);\n }\n formatsArr = _.map(contents.ops, 'attributes');\n return this._intersectFormats(formatsArr);\n };\n\n Toolbar.prototype._getLineActive = function(range) {\n var firstLine, formatsArr, lastLine, offset, ref, ref1;\n formatsArr = [];\n ref = this.quill.editor.doc.findLineAt(range.start), firstLine = ref[0], offset = ref[1];\n ref1 = this.quill.editor.doc.findLineAt(range.end), lastLine = ref1[0], offset = ref1[1];\n if ((lastLine != null) && lastLine === firstLine) {\n lastLine = lastLine.next;\n }\n while ((firstLine != null) && firstLine !== lastLine) {\n formatsArr.push(_.clone(firstLine.formats));\n firstLine = firstLine.next;\n }\n return this._intersectFormats(formatsArr);\n };\n\n Toolbar.prototype._intersectFormats = function(formatsArr) {\n return _.reduce(formatsArr.slice(1), function(activeFormats, formats) {\n var activeKeys, added, formatKeys, intersection, missing;\n if (formats == null) {\n formats = {};\n }\n activeKeys = Object.keys(activeFormats);\n formatKeys = formats != null ? Object.keys(formats) : {};\n intersection = _.intersection(activeKeys, formatKeys);\n missing = _.difference(activeKeys, formatKeys);\n added = _.difference(formatKeys, activeKeys);\n _.each(intersection, function(name) {\n if (Toolbar.formats.SELECT[name] != null) {\n if (Array.isArray(activeFormats[name])) {\n if (activeFormats[name].indexOf(formats[name]) < 0) {\n return activeFormats[name].push(formats[name]);\n }\n } else if (activeFormats[name] !== formats[name]) {\n return activeFormats[name] = [activeFormats[name], formats[name]];\n }\n }\n });\n _.each(missing, function(name) {\n if (Toolbar.formats.TOGGLE[name] != null) {\n return delete activeFormats[name];\n } else if ((Toolbar.formats.SELECT[name] != null) && !Array.isArray(activeFormats[name])) {\n return activeFormats[name] = [activeFormats[name]];\n }\n });\n _.each(added, function(name) {\n if (Toolbar.formats.SELECT[name] != null) {\n return activeFormats[name] = [formats[name]];\n }\n });\n return activeFormats;\n }, formatsArr[0] || {});\n };\n\n return Toolbar;\n\n})();\n\nQuill.registerModule('toolbar', Toolbar);\n\nmodule.exports = Toolbar;\n\n\n},{\"../quill\":30}],28:[function(_dereq_,module,exports){\nvar Quill, Tooltip, _, dom;\n\nQuill = _dereq_('../quill');\n\n_ = Quill.require('lodash');\n\ndom = Quill.require('dom');\n\nTooltip = (function() {\n Tooltip.DEFAULTS = {\n offset: 10,\n template: ''\n };\n\n Tooltip.HIDE_MARGIN = '-10000px';\n\n function Tooltip(quill, options) {\n this.quill = quill;\n this.options = options;\n this.container = this.quill.addContainer('ql-tooltip');\n this.container.innerHTML = this.options.template;\n this.hide();\n this.quill.on(this.quill.constructor.events.TEXT_CHANGE, (function(_this) {\n return function(delta, source) {\n if (_this.container.style.left !== Tooltip.HIDE_MARGIN) {\n _this.range = null;\n return _this.hide();\n }\n };\n })(this));\n }\n\n Tooltip.prototype.initTextbox = function(textbox, enterCallback, escapeCallback) {\n return dom(textbox).on('keydown', (function(_this) {\n return function(event) {\n switch (event.which) {\n case dom.KEYS.ENTER:\n event.preventDefault();\n return enterCallback.call(_this);\n case dom.KEYS.ESCAPE:\n event.preventDefault();\n return escapeCallback.call(_this);\n default:\n return true;\n }\n };\n })(this));\n };\n\n Tooltip.prototype.hide = function() {\n this.container.style.left = Tooltip.HIDE_MARGIN;\n if (this.range) {\n this.quill.setSelection(this.range);\n }\n return this.range = null;\n };\n\n Tooltip.prototype.position = function(reference) {\n var left, offsetBottom, offsetLeft, offsetTop, parentBounds, referenceBounds, top;\n if (reference != null) {\n referenceBounds = reference.getBoundingClientRect();\n parentBounds = this.quill.container.getBoundingClientRect();\n offsetLeft = referenceBounds.left - parentBounds.left;\n offsetTop = referenceBounds.top - parentBounds.top;\n offsetBottom = referenceBounds.bottom - parentBounds.bottom;\n left = offsetLeft + referenceBounds.width / 2 - this.container.offsetWidth / 2;\n top = offsetTop + referenceBounds.height + this.options.offset;\n if (top + this.container.offsetHeight > this.quill.container.offsetHeight) {\n top = offsetTop - this.container.offsetHeight - this.options.offset;\n }\n left = Math.max(0, Math.min(left, this.quill.container.offsetWidth - this.container.offsetWidth));\n top = Math.max(0, Math.min(top, this.quill.container.offsetHeight - this.container.offsetHeight));\n } else {\n left = this.quill.container.offsetWidth / 2 - this.container.offsetWidth / 2;\n top = this.quill.container.offsetHeight / 2 - this.container.offsetHeight / 2;\n }\n top += this.quill.container.scrollTop;\n return [left, top];\n };\n\n Tooltip.prototype.show = function(reference) {\n var left, ref, top;\n this.range = this.quill.getSelection();\n ref = this.position(reference), left = ref[0], top = ref[1];\n this.container.style.left = left + \"px\";\n this.container.style.top = top + \"px\";\n return this.container.focus();\n };\n\n return Tooltip;\n\n})();\n\nQuill.registerModule('tooltip', Tooltip);\n\nmodule.exports = Tooltip;\n\n\n},{\"../quill\":30}],29:[function(_dereq_,module,exports){\nvar Delta, Quill, UndoManager, _;\n\nQuill = _dereq_('../quill');\n\n_ = Quill.require('lodash');\n\nDelta = Quill.require('delta');\n\nUndoManager = (function() {\n UndoManager.DEFAULTS = {\n delay: 1000,\n maxStack: 100,\n userOnly: false\n };\n\n UndoManager.hotkeys = {\n UNDO: {\n key: 'Z',\n metaKey: true\n },\n REDO: {\n key: 'Z',\n metaKey: true,\n shiftKey: true\n }\n };\n\n function UndoManager(quill, options) {\n this.quill = quill;\n this.options = options != null ? options : {};\n this.lastRecorded = 0;\n this.ignoreChange = false;\n this.clear();\n this.initListeners();\n }\n\n UndoManager.prototype.initListeners = function() {\n this.quill.onModuleLoad('keyboard', (function(_this) {\n return function(keyboard) {\n var redoKey;\n keyboard.addHotkey(UndoManager.hotkeys.UNDO, function() {\n _this.quill.editor.checkUpdate();\n _this.undo();\n return false;\n });\n redoKey = [UndoManager.hotkeys.REDO];\n if (navigator.platform.indexOf('Win') > -1) {\n redoKey.push({\n key: 'Y',\n metaKey: true\n });\n }\n return keyboard.addHotkey(redoKey, function() {\n _this.quill.editor.checkUpdate();\n _this.redo();\n return false;\n });\n };\n })(this));\n return this.quill.on(this.quill.constructor.events.TEXT_CHANGE, (function(_this) {\n return function(delta, source) {\n if (_this.ignoreChange) {\n return;\n }\n if (!_this.options.userOnly || source === Quill.sources.USER) {\n _this.record(delta, _this.oldDelta);\n } else {\n _this._transform(delta);\n }\n return _this.oldDelta = _this.quill.getContents();\n };\n })(this));\n };\n\n UndoManager.prototype.clear = function() {\n this.stack = {\n undo: [],\n redo: []\n };\n return this.oldDelta = this.quill.getContents();\n };\n\n UndoManager.prototype.record = function(changeDelta, oldDelta) {\n var change, ignored, timestamp, undoDelta;\n if (!(changeDelta.ops.length > 0)) {\n return;\n }\n this.stack.redo = [];\n try {\n undoDelta = this.quill.getContents().diff(this.oldDelta);\n timestamp = new Date().getTime();\n if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) {\n change = this.stack.undo.pop();\n undoDelta = undoDelta.compose(change.undo);\n changeDelta = change.redo.compose(changeDelta);\n } else {\n this.lastRecorded = timestamp;\n }\n this.stack.undo.push({\n redo: changeDelta,\n undo: undoDelta\n });\n if (this.stack.undo.length > this.options.maxStack) {\n return this.stack.undo.unshift();\n }\n } catch (_error) {\n ignored = _error;\n console.warn('Could not record change... clearing undo stack.');\n return this.clear();\n }\n };\n\n UndoManager.prototype.redo = function() {\n return this._change('redo', 'undo');\n };\n\n UndoManager.prototype.undo = function() {\n return this._change('undo', 'redo');\n };\n\n UndoManager.prototype._getLastChangeIndex = function(delta) {\n var index, lastIndex;\n lastIndex = 0;\n index = 0;\n _.each(delta.ops, function(op) {\n if (op.insert != null) {\n return lastIndex = Math.max(index + (op.insert.length || 1), lastIndex);\n } else if (op[\"delete\"] != null) {\n return lastIndex = Math.max(index, lastIndex);\n } else if (op.retain != null) {\n if (op.attributes != null) {\n lastIndex = Math.max(index + op.retain, lastIndex);\n }\n return index += op.retain;\n }\n });\n return lastIndex;\n };\n\n UndoManager.prototype._change = function(source, dest) {\n var change, index;\n if (this.stack[source].length > 0) {\n change = this.stack[source].pop();\n this.lastRecorded = 0;\n this.ignoreChange = true;\n this.quill.updateContents(change[source], Quill.sources.USER);\n this.ignoreChange = false;\n index = this._getLastChangeIndex(change[source]);\n this.quill.setSelection(index, index);\n this.oldDelta = this.quill.getContents();\n return this.stack[dest].push(change);\n }\n };\n\n UndoManager.prototype._transform = function(delta) {\n var change, i, j, len, len1, ref, ref1, results;\n this.oldDelta = delta.transform(this.oldDelta, true);\n ref = this.stack.undo;\n for (i = 0, len = ref.length; i < len; i++) {\n change = ref[i];\n change.undo = delta.transform(change.undo, true);\n change.redo = delta.transform(change.redo, true);\n }\n ref1 = this.stack.redo;\n results = [];\n for (j = 0, len1 = ref1.length; j < len1; j++) {\n change = ref1[j];\n change.undo = delta.transform(change.undo, true);\n results.push(change.redo = delta.transform(change.redo, true));\n }\n return results;\n };\n\n return UndoManager;\n\n})();\n\nQuill.registerModule('undo-manager', UndoManager);\n\nmodule.exports = UndoManager;\n\n\n},{\"../quill\":30}],30:[function(_dereq_,module,exports){\nvar Delta, Document, Editor, EventEmitter2, Format, Normalizer, Quill, Range, _, dom, pkg,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n slice = [].slice;\n\n_ = _dereq_('lodash');\n\npkg = _dereq_('../package.json');\n\nDelta = _dereq_('rich-text/lib/delta');\n\nEventEmitter2 = _dereq_('eventemitter2').EventEmitter2;\n\ndom = _dereq_('./lib/dom');\n\nDocument = _dereq_('./core/document');\n\nEditor = _dereq_('./core/editor');\n\nFormat = _dereq_('./core/format');\n\nNormalizer = _dereq_('./core/normalizer');\n\nRange = _dereq_('./lib/range');\n\nQuill = (function(superClass) {\n extend(Quill, superClass);\n\n Quill.version = pkg.version;\n\n Quill.editors = [];\n\n Quill.modules = [];\n\n Quill.themes = [];\n\n Quill.DEFAULTS = {\n formats: ['align', 'bold', 'italic', 'strike', 'underline', 'color', 'background', 'font', 'size', 'link', 'image', 'bullet', 'list'],\n modules: {\n 'keyboard': true,\n 'paste-manager': true,\n 'undo-manager': true\n },\n pollInterval: 100,\n readOnly: false,\n styles: {},\n theme: 'base'\n };\n\n Quill.events = {\n FORMAT_INIT: 'format-init',\n MODULE_INIT: 'module-init',\n POST_EVENT: 'post-event',\n PRE_EVENT: 'pre-event',\n SELECTION_CHANGE: 'selection-change',\n TEXT_CHANGE: 'text-change'\n };\n\n Quill.sources = Editor.sources;\n\n Quill.registerModule = function(name, module) {\n if (Quill.modules[name] != null) {\n console.warn(\"Overwriting \" + name + \" module\");\n }\n return Quill.modules[name] = module;\n };\n\n Quill.registerTheme = function(name, theme) {\n if (Quill.themes[name] != null) {\n console.warn(\"Overwriting \" + name + \" theme\");\n }\n return Quill.themes[name] = theme;\n };\n\n Quill.require = function(name) {\n switch (name) {\n case 'lodash':\n return _;\n case 'delta':\n return Delta;\n case 'format':\n return Format;\n case 'normalizer':\n return Normalizer;\n case 'dom':\n return dom;\n case 'document':\n return Document;\n case 'range':\n return Range;\n default:\n return null;\n }\n };\n\n function Quill(container1, options) {\n var html, moduleOptions, themeClass;\n this.container = container1;\n if (options == null) {\n options = {};\n }\n if (_.isString(this.container)) {\n this.container = document.querySelector(this.container);\n }\n if (this.container == null) {\n throw new Error('Invalid Quill container');\n }\n moduleOptions = _.defaults(options.modules || {}, Quill.DEFAULTS.modules);\n html = this.container.innerHTML;\n this.container.innerHTML = '';\n this.options = _.defaults(options, Quill.DEFAULTS);\n this.options.modules = moduleOptions;\n this.options.id = this.id = \"ql-editor-\" + (Quill.editors.length + 1);\n this.modules = {};\n this.root = this.addContainer('ql-editor');\n this.editor = new Editor(this.root, this, this.options);\n Quill.editors.push(this);\n this.setHTML(html, Quill.sources.SILENT);\n themeClass = Quill.themes[this.options.theme];\n if (themeClass == null) {\n throw new Error(\"Cannot load \" + this.options.theme + \" theme. Are you sure you registered it?\");\n }\n this.theme = new themeClass(this, this.options);\n _.each(this.options.modules, (function(_this) {\n return function(option, name) {\n return _this.addModule(name, option);\n };\n })(this));\n }\n\n Quill.prototype.destroy = function() {\n var html;\n html = this.getHTML();\n _.each(this.modules, function(module, name) {\n if (_.isFunction(module.destroy)) {\n return module.destroy();\n }\n });\n this.editor.destroy();\n this.removeAllListeners();\n Quill.editors.splice(_.indexOf(Quill.editors, this), 1);\n return this.container.innerHTML = html;\n };\n\n Quill.prototype.addContainer = function(className, before) {\n var container, refNode;\n if (before == null) {\n before = false;\n }\n refNode = before ? this.root : null;\n container = document.createElement('div');\n dom(container).addClass(className);\n this.container.insertBefore(container, refNode);\n return container;\n };\n\n Quill.prototype.addFormat = function(name, config) {\n this.editor.doc.addFormat(name, config);\n return this.emit(Quill.events.FORMAT_INIT, name);\n };\n\n Quill.prototype.addModule = function(name, options) {\n var moduleClass;\n moduleClass = Quill.modules[name];\n if (moduleClass == null) {\n throw new Error(\"Cannot load \" + name + \" module. Are you sure you registered it?\");\n }\n if (options === true) {\n options = {};\n }\n options = _.defaults(options, this.theme.constructor.OPTIONS[name] || {}, moduleClass.DEFAULTS || {});\n this.modules[name] = new moduleClass(this, options);\n this.emit(Quill.events.MODULE_INIT, name, this.modules[name]);\n return this.modules[name];\n };\n\n Quill.prototype.deleteText = function(start, end, source) {\n var delta, formats, ref;\n if (source == null) {\n source = Quill.sources.API;\n }\n ref = this._buildParams(start, end, {}, source), start = ref[0], end = ref[1], formats = ref[2], source = ref[3];\n if (!(end > start)) {\n return;\n }\n delta = new Delta().retain(start)[\"delete\"](end - start);\n return this.editor.applyDelta(delta, source);\n };\n\n Quill.prototype.emit = function() {\n var args, eventName;\n eventName = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n Quill.__super__.emit.apply(this, [Quill.events.PRE_EVENT, eventName].concat(slice.call(args)));\n Quill.__super__.emit.apply(this, [eventName].concat(slice.call(args)));\n return Quill.__super__.emit.apply(this, [Quill.events.POST_EVENT, eventName].concat(slice.call(args)));\n };\n\n Quill.prototype.focus = function() {\n return this.editor.focus();\n };\n\n Quill.prototype.formatLine = function(start, end, name, value, source) {\n var formats, line, offset, ref, ref1;\n ref = this._buildParams(start, end, name, value, source), start = ref[0], end = ref[1], formats = ref[2], source = ref[3];\n ref1 = this.editor.doc.findLineAt(end), line = ref1[0], offset = ref1[1];\n if (line != null) {\n end += line.length - offset;\n }\n return this.formatText(start, end, formats, source);\n };\n\n Quill.prototype.formatText = function(start, end, name, value, source) {\n var delta, formats, ref;\n ref = this._buildParams(start, end, name, value, source), start = ref[0], end = ref[1], formats = ref[2], source = ref[3];\n formats = _.reduce(formats, (function(_this) {\n return function(formats, value, name) {\n var format;\n format = _this.editor.doc.formats[name];\n if (!(value && value !== format.config[\"default\"])) {\n formats[name] = null;\n }\n return formats;\n };\n })(this), formats);\n delta = new Delta().retain(start).retain(end - start, formats);\n return this.editor.applyDelta(delta, source);\n };\n\n Quill.prototype.getBounds = function(index) {\n return this.editor.getBounds(index);\n };\n\n Quill.prototype.getContents = function(start, end) {\n if (start == null) {\n start = 0;\n }\n if (end == null) {\n end = null;\n }\n if (_.isObject(start)) {\n end = start.end;\n start = start.start;\n }\n return this.editor.delta.slice(start, end);\n };\n\n Quill.prototype.getHTML = function() {\n return this.editor.doc.getHTML();\n };\n\n Quill.prototype.getLength = function() {\n return this.editor.length;\n };\n\n Quill.prototype.getModule = function(name) {\n return this.modules[name];\n };\n\n Quill.prototype.getSelection = function() {\n this.editor.checkUpdate();\n return this.editor.selection.getRange();\n };\n\n Quill.prototype.getText = function(start, end) {\n if (start == null) {\n start = 0;\n }\n if (end == null) {\n end = null;\n }\n return _.map(this.getContents(start, end).ops, function(op) {\n if (_.isString(op.insert)) {\n return op.insert;\n } else {\n return '';\n }\n }).join('');\n };\n\n Quill.prototype.insertEmbed = function(index, type, url, source) {\n var delta, end, formats, ref;\n ref = this._buildParams(index, 0, type, url, source), index = ref[0], end = ref[1], formats = ref[2], source = ref[3];\n delta = new Delta().retain(index).insert(1, formats);\n return this.editor.applyDelta(delta, source);\n };\n\n Quill.prototype.insertText = function(index, text, name, value, source) {\n var delta, end, formats, ref;\n ref = this._buildParams(index, 0, name, value, source), index = ref[0], end = ref[1], formats = ref[2], source = ref[3];\n if (!(text.length > 0)) {\n return;\n }\n delta = new Delta().retain(index).insert(text, formats);\n return this.editor.applyDelta(delta, source);\n };\n\n Quill.prototype.onModuleLoad = function(name, callback) {\n if (this.modules[name]) {\n return callback(this.modules[name]);\n }\n return this.on(Quill.events.MODULE_INIT, function(moduleName, module) {\n if (moduleName === name) {\n return callback(module);\n }\n });\n };\n\n Quill.prototype.prepareFormat = function(name, value, source) {\n var format, range;\n if (source == null) {\n source = Quill.sources.API;\n }\n format = this.editor.doc.formats[name];\n if (format == null) {\n return;\n }\n range = this.getSelection();\n if (!(range != null ? range.isCollapsed() : void 0)) {\n return;\n }\n if (format.isType(Format.types.LINE)) {\n return this.formatLine(range, name, value, source);\n } else {\n return format.prepare(value);\n }\n };\n\n Quill.prototype.setContents = function(delta, source) {\n var lastOp;\n if (source == null) {\n source = Quill.sources.API;\n }\n if (Array.isArray(delta)) {\n delta = new Delta(delta.slice());\n } else {\n delta = new Delta(delta.ops.slice());\n }\n lastOp = _.last(delta.slice(delta.length() - 1).ops);\n delta[\"delete\"](this.getLength() - 1);\n if ((lastOp != null) && _.isString(lastOp.insert) && _.last(lastOp.insert) === '\\n') {\n delta[\"delete\"](1);\n }\n return this.updateContents(delta, source);\n };\n\n Quill.prototype.setHTML = function(html, source) {\n if (source == null) {\n source = Quill.sources.API;\n }\n if (!html.trim()) {\n html = \"<\" + dom.DEFAULT_BLOCK_TAG + \"><\" + dom.DEFAULT_BREAK_TAG + \"></\" + dom.DEFAULT_BLOCK_TAG + \">\";\n }\n this.editor.doc.setHTML(html);\n return this.editor.checkUpdate(source);\n };\n\n Quill.prototype.setSelection = function(start, end, source) {\n var range;\n if (source == null) {\n source = Quill.sources.API;\n }\n if (_.isNumber(start) && _.isNumber(end)) {\n range = new Range(start, end);\n } else {\n range = start;\n source = end || source;\n }\n return this.editor.selection.setRange(range, source);\n };\n\n Quill.prototype.setText = function(text, source) {\n var delta;\n if (source == null) {\n source = Quill.sources.API;\n }\n delta = new Delta().insert(text);\n return this.setContents(delta, source);\n };\n\n Quill.prototype.updateContents = function(delta, source) {\n if (source == null) {\n source = Quill.sources.API;\n }\n if (Array.isArray(delta)) {\n delta = {\n ops: delta\n };\n }\n return this.editor.applyDelta(delta, source);\n };\n\n Quill.prototype._buildParams = function() {\n var formats, params;\n params = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n if (_.isObject(params[0])) {\n params.splice(0, 1, params[0].start, params[0].end);\n }\n if (_.isString(params[2])) {\n formats = {};\n formats[params[2]] = params[3];\n params.splice(2, 2, formats);\n }\n if (params[3] == null) {\n params[3] = Quill.sources.API;\n }\n return params;\n };\n\n return Quill;\n\n})(EventEmitter2);\n\nQuill.registerTheme('base', _dereq_('./themes/base'));\n\nQuill.registerTheme('snow', _dereq_('./themes/snow'));\n\nmodule.exports = Quill;\n\n\n},{\"../package.json\":7,\"./core/document\":8,\"./core/editor\":9,\"./core/format\":10,\"./core/normalizer\":13,\"./lib/dom\":17,\"./lib/range\":20,\"./themes/base\":32,\"./themes/snow\":33,\"eventemitter2\":2,\"lodash\":1,\"rich-text/lib/delta\":3}],31:[function(_dereq_,module,exports){\nmodule.exports = \".ql-image-tooltip{padding:10px;width:300px}.ql-image-tooltip:after{clear:both;content:\\\"\\\";display:table}.ql-image-tooltip a{border:1px solid #000;box-sizing:border-box;display:inline-block;float:left;padding:5px;text-align:center;width:50%}.ql-image-tooltip img{bottom:0;left:0;margin:auto;max-height:100%;max-width:100%;position:absolute;right:0;top:0}.ql-image-tooltip .input{box-sizing:border-box;width:100%}.ql-image-tooltip .preview{margin:10px 0;position:relative;border:1px dashed #000;height:200px}.ql-image-tooltip .preview span{display:inline-block;position:absolute;text-align:center;top:40%;width:100%}.ql-link-tooltip{padding:5px 10px}.ql-link-tooltip input.input{width:170px}.ql-link-tooltip a.done,.ql-link-tooltip input.input{display:none}.ql-link-tooltip a.change{margin-right:4px}.ql-link-tooltip.editing a.done,.ql-link-tooltip.editing input.input{display:inline-block}.ql-link-tooltip.editing a.change,.ql-link-tooltip.editing a.remove,.ql-link-tooltip.editing a.url{display:none}.ql-multi-cursor{position:absolute;left:0;top:0;z-index:1000}.ql-multi-cursor .cursor{margin-left:-1px;position:absolute}.ql-multi-cursor .cursor-flag{bottom:100%;position:absolute;white-space:nowrap}.ql-multi-cursor .cursor-name{display:inline-block;color:#fff;padding:2px 8px}.ql-multi-cursor .cursor-caret{height:100%;position:absolute;width:2px}.ql-multi-cursor .cursor.hidden .cursor-flag{display:none}.ql-multi-cursor .cursor.top .cursor-flag{bottom:auto;top:100%}.ql-multi-cursor .cursor.right .cursor-flag{right:-2px}.ql-paste-manager{left:-100000px;position:absolute;top:50%}.ql-toolbar{box-sizing:border-box}.ql-tooltip{background-color:#fff;border:1px solid #000;box-sizing:border-box;position:absolute;top:0;white-space:nowrap;z-index:2000}.ql-tooltip a{cursor:pointer;text-decoration:none}.ql-container{box-sizing:border-box;cursor:text;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;line-height:1.42;margin:0;overflow-x:hidden;overflow-y:auto;padding:12px 15px;position:relative}.ql-editor{box-sizing:border-box;min-height:100%;outline:0;tab-size:4;white-space:pre-wrap}.ql-editor div{margin:0;padding:0}.ql-editor a{text-decoration:underline}.ql-editor b{font-weight:700}.ql-editor i{font-style:italic}.ql-editor s{text-decoration:line-through}.ql-editor u{text-decoration:underline}.ql-editor a,.ql-editor b,.ql-editor i,.ql-editor s,.ql-editor span,.ql-editor u{background-color:inherit}.ql-editor img{max-width:100%}.ql-editor blockquote,.ql-editor ol,.ql-editor ul{margin:0 0 0 2em;padding:0}.ql-editor ol{list-style-type:decimal}.ql-editor ul{list-style-type:disc}.ql-editor.ql-ie-10 br,.ql-editor.ql-ie-9 br{display:none}\";\n},{}],32:[function(_dereq_,module,exports){\nvar BaseTheme, _, baseStyles, dom;\n\n_ = _dereq_('lodash');\n\ndom = _dereq_('../../lib/dom');\n\nbaseStyles = _dereq_('./base.styl');\n\nBaseTheme = (function() {\n BaseTheme.OPTIONS = {};\n\n BaseTheme.objToCss = function(obj) {\n return _.map(obj, function(value, key) {\n var innerStr;\n innerStr = _.map(value, function(innerValue, innerKey) {\n return innerKey + \": \" + innerValue + \";\";\n }).join(' ');\n return key + \" { \" + innerStr + \" }\";\n }).join(\"\\n\");\n };\n\n function BaseTheme(quill, options) {\n var version;\n this.quill = quill;\n this.options = options;\n dom(this.quill.container).addClass('ql-container');\n if (this.options.styles) {\n this.addStyles(baseStyles + BaseTheme.objToCss(this.options.styles));\n }\n if (dom.isIE(10)) {\n version = dom.isIE(9) ? '9' : '10';\n dom(this.quill.root).addClass('ql-ie-' + version);\n }\n }\n\n BaseTheme.prototype.addStyles = function(css) {\n var style;\n if (_.isObject(css)) {\n css = BaseTheme.objToCss(css);\n }\n style = document.createElement('style');\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n return document.head.appendChild(style);\n };\n\n return BaseTheme;\n\n})();\n\nmodule.exports = BaseTheme;\n\n\n},{\"../../lib/dom\":17,\"./base.styl\":31,\"lodash\":1}],33:[function(_dereq_,module,exports){\nvar BaseTheme, ColorPicker, Picker, SnowTheme, _, dom,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n_ = _dereq_('lodash');\n\nColorPicker = _dereq_('../../lib/color-picker');\n\nBaseTheme = _dereq_('../base');\n\ndom = _dereq_('../../lib/dom');\n\nPicker = _dereq_('../../lib/picker');\n\nSnowTheme = (function(superClass) {\n extend(SnowTheme, superClass);\n\n SnowTheme.COLORS = [\"#000000\", \"#e60000\", \"#ff9900\", \"#ffff00\", \"#008A00\", \"#0066cc\", \"#9933ff\", \"#ffffff\", \"#facccc\", \"#ffebcc\", \"#ffffcc\", \"#cce8cc\", \"#cce0f5\", \"#ebd6ff\", \"#bbbbbb\", \"#f06666\", \"#ffc266\", \"#ffff66\", \"#66b966\", \"#66a3e0\", \"#c285ff\", \"#888888\", \"#a10000\", \"#b26b00\", \"#b2b200\", \"#006100\", \"#0047b2\", \"#6b24b2\", \"#444444\", \"#5c0000\", \"#663d00\", \"#666600\", \"#003700\", \"#002966\", \"#3d1466\"];\n\n SnowTheme.OPTIONS = {\n 'multi-cursor': {\n template: '<span class=\"cursor-flag\"> <span class=\"cursor-triangle top\"></span> <span class=\"cursor-name\"></span> <span class=\"cursor-triangle bottom\"></span> </span> <span class=\"cursor-caret\"></span>'\n }\n };\n\n function SnowTheme(quill, options) {\n this.quill = quill;\n this.options = options;\n SnowTheme.__super__.constructor.apply(this, arguments);\n dom(this.quill.container).addClass('ql-snow');\n this.pickers = [];\n this.quill.on(this.quill.constructor.events.SELECTION_CHANGE, (function(_this) {\n return function(range) {\n if (range != null) {\n return _.invoke(_this.pickers, 'close');\n }\n };\n })(this));\n this.quill.onModuleLoad('multi-cursor', _.bind(this.extendMultiCursor, this));\n this.quill.onModuleLoad('toolbar', _.bind(this.extendToolbar, this));\n }\n\n SnowTheme.prototype.extendMultiCursor = function(module) {\n return module.on(module.constructor.events.CURSOR_ADDED, function(cursor) {\n var bottomTriangle, topTriangle;\n bottomTriangle = cursor.elem.querySelector('.cursor-triangle.bottom');\n topTriangle = cursor.elem.querySelector('.cursor-triangle.top');\n return bottomTriangle.style.borderTopColor = topTriangle.style.borderBottomColor = cursor.color;\n });\n };\n\n SnowTheme.prototype.extendToolbar = function(module) {\n dom(module.container).addClass('ql-snow');\n _.each(['color', 'background', 'font', 'size', 'align'], (function(_this) {\n return function(format) {\n var picker, select;\n select = module.container.querySelector(\".ql-\" + format);\n if (select == null) {\n return;\n }\n switch (format) {\n case 'font':\n case 'size':\n case 'align':\n picker = new Picker(select);\n break;\n case 'color':\n case 'background':\n picker = new ColorPicker(select);\n _.each(picker.container.querySelectorAll('.ql-picker-item'), function(item, i) {\n if (i < 7) {\n return dom(item).addClass('ql-primary-color');\n }\n });\n }\n if (picker != null) {\n return _this.pickers.push(picker);\n }\n };\n })(this));\n return _.each(dom(module.container).textNodes(), function(node) {\n if (dom(node).text().trim().length === 0) {\n return dom(node).remove();\n }\n });\n };\n\n return SnowTheme;\n\n})(BaseTheme);\n\nmodule.exports = SnowTheme;\n\n\n},{\"../../lib/color-picker\":16,\"../../lib/dom\":17,\"../../lib/picker\":19,\"../base\":32,\"lodash\":1}]},{},[15])(15)\n});"],"sourceRoot":"/source/"} |