{ "version": 3, "file": "sky.js", "sources": [ "js/sky/src/alert/alert.module.js", "js/sky/src/avatar/avatar.module.js", "js/sky/src/card/card.module.js", "js/sky/src/checklist/checklist.module.js", "js/sky/src/chevron/chevron.module.js", "js/sky/src/contextmenu/contextmenu.module.js", "js/sky/src/contextmenu/submenu.module.js", "js/sky/src/error/error.module.js", "js/sky/src/pagesummary/pagesummary.module.js", "js/sky/src/reorder/reorder.module.js", "js/sky/src/repeater/repeater.module.js", "js/sky/src/selectfield/selectfield.module.js", "js/sky/src/actionbar/actionbar.js", "js/sky/src/alert/alert.directive.js", "js/sky/src/autofocus/autofocus.js", "js/sky/src/autonumeric/autonumeric.js", "js/sky/src/avatar/avatar.config.js", "js/sky/src/avatar/avatar.directive.js", "js/sky/src/card/card.directive.js", "js/sky/src/check/check.js", "js/sky/src/checklist/checklist.controller.js", "js/sky/src/checklist/checklist.directive.js", "js/sky/src/checklist/checklistcolumn.directive.js", "js/sky/src/checklist/checklistcolumns.controller.js", "js/sky/src/checklist/checklistcolumns.directive.js", "js/sky/src/checklist/checklistmodel.directive.js", "js/sky/src/checklist/checklistutility.service.js", "js/sky/src/chevron/chevron.controller.js", "js/sky/src/chevron/chevron.directive.js", "js/sky/src/contextmenu/contextmenu.button.controller.js", "js/sky/src/contextmenu/contextmenu.button.directive.js", "js/sky/src/contextmenu/contextmenu.controller.js", "js/sky/src/contextmenu/contextmenu.directive.js", "js/sky/src/contextmenu/contextmenu.item.directive.js", "js/sky/src/contextmenu/contextmenu.toggleaccordion.factory.js", "js/sky/src/contextmenu/submenu.directive.js", "js/sky/src/contextmenu/submenu.heading.directive.js", "js/sky/src/data/data.js", "js/sky/src/datepicker/datepicker.js", "js/sky/src/daterangepicker/daterangepicker.js", "js/sky/src/error/error.action.directive.js", "js/sky/src/error/error.description.directive.js", "js/sky/src/error/error.directive.js", "js/sky/src/error/error.image.directive.js", "js/sky/src/error/error.title.directive.js", "js/sky/src/error/errormodal.controller.js", "js/sky/src/error/errormodal.service.js", "js/sky/src/fileattachments/fileattachments.js", "js/sky/src/fileattachments/filedrop.js", "js/sky/src/fileattachments/fileitem.js", "js/sky/src/fileattachments/filesize.js", "js/sky/src/format/format.js", "js/sky/src/grids/columnpicker.js", "js/sky/src/grids/gridactionbar.js", "js/sky/src/grids/gridfilters.js", "js/sky/src/grids/grids.js", "js/sky/src/grids/gridtoolbar.js", "js/sky/src/help/help.js", "js/sky/src/helpbutton/helpbutton.js", "js/sky/src/highlight/highlight.js", "js/sky/src/mediabreakpoints/mediabreakpoints.js", "js/sky/src/modal/modal.js", "js/sky/src/moment/moment.js", "js/sky/src/navbar/navbar.js", "js/sky/src/omnibar/omnibar.js", "js/sky/src/page/page.js", "js/sky/src/pagesummary/pagesummary.directive.js", "js/sky/src/pagination/pagination.js", "js/sky/src/palette/config.js", "js/sky/src/palette/palette.js", "js/sky/src/popover/popover.js", "js/sky/src/reorder/reorder.directive.js", "js/sky/src/repeater/repeater.controller.js", "js/sky/src/repeater/repeater.directive.js", "js/sky/src/repeater/repeater.item.directive.js", "js/sky/src/resources/resources.js", "js/sky/src/scrollintoview/scrollintoview.js", "js/sky/src/searchfield/searchfield.js", "js/sky/src/selectfield/selectfield.controller.js", "js/sky/src/selectfield/selectfield.directive.js", "js/sky/src/selectfield/selectfielditem.animation.js", "js/sky/src/selectfield/selectfieldpicker.directive.js", "js/sky/src/tabscroll/tabscroll.js", "js/sky/src/tabset/tabset.js", "js/sky/src/tabsref/tabsref.js", "js/sky/src/templating/templating.js", "js/sky/src/textexpand/textexpand.js", "js/sky/src/tiles/tiles.js", "js/sky/src/toast/toast.js", "js/sky/src/tooltip/tooltip.js", "js/sky/src/utilities/utilities.js", "js/sky/src/validation/validation.js", "js/sky/src/viewkeeper/viewkeeper.js", "js/sky/src/wait/wait.js", "js/sky/src/window/window.js", "js/sky/src/wizard/wizard.js", "js/sky/src/module.js", "dist/js/locales/sky-locale-en-US.js", "js/sky/templates/templates.js.tmp" ], "names": [], "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACz7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,K;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACnbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AClRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC1EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A", "sourceRoot": "../..", "sourcesContent": [ "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.alert', ['sky.alert.directive']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.avatar', ['sky.avatar.config', 'sky.avatar.directive']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module(\n 'sky.card',\n [\n 'sky.card.directive'\n ]\n );\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module(\n 'sky.checklist',\n [\n 'sky.checklist.directive',\n 'sky.checklist.column.directive',\n 'sky.checklist.columns.directive',\n 'sky.checklist.model.directive'\n ]\n );\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.chevron', ['sky.chevron.directive']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module(\n 'sky.contextmenu',\n [\n 'sky.contextmenu.directive',\n 'sky.contextmenu.button.directive',\n 'sky.contextmenu.item.directive',\n 'sky.submenu'\n ]\n );\n}());\n", "/* global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.submenu', ['sky.submenu.directive']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.error', ['sky.error.directive', 'sky.errormodal.service']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.pagesummary', []);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.reorder', ['sky.reorder.directive']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.repeater', ['sky.repeater.directive', 'sky.repeater.item.directive']);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module(\n 'sky.selectfield',\n [\n 'sky.selectfield.directive',\n 'sky.selectfieldpicker.directive',\n 'sky.selectfield.item.animation'\n ]\n );\n\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbActionBar() {\n return {\n controller: angular.noop,\n controllerAs: 'bbActionBar',\n bindToController: true,\n scope: {},\n transclude: true,\n restrict: 'E',\n templateUrl: 'sky/templates/actionbar/actionbar.html'\n };\n }\n\n function bbActionBarItemGroup(bbResources, bbMediaBreakpoints) {\n return {\n replace: true,\n transclude: true,\n controller: function () {\n var vm = this;\n\n if (vm.title === null || angular.isUndefined(vm.title)) {\n vm.title = bbResources.action_bar_actions;\n }\n },\n controllerAs: 'bbActionBarItemGroup',\n bindToController: {\n title: '=?bbActionBarItemGroupTitle'\n },\n restrict: 'E',\n scope: {},\n link: function ($scope, el) {\n function mediaBreakpointHandler(breakpoints) {\n if (breakpoints.xs) {\n el.find('.bb-action-bar-buttons > ng-transclude').appendTo(el.find('.bb-action-bar-dropdown > .dropdown > ul'));\n } else {\n el.find('.bb-action-bar-dropdown .dropdown > ul > ng-transclude').appendTo(el.find('.bb-action-bar-buttons'));\n }\n }\n\n bbMediaBreakpoints.register(mediaBreakpointHandler);\n\n $scope.$on('$destroy', function () {\n bbMediaBreakpoints.unregister(mediaBreakpointHandler);\n });\n },\n templateUrl: 'sky/templates/actionbar/actionbaritemgroup.html'\n };\n }\n\n bbActionBarItemGroup.$inject = ['bbResources', 'bbMediaBreakpoints'];\n\n function bbActionBarItem(bbMediaBreakpoints) {\n return {\n replace: true,\n controller: angular.noop,\n controllerAs: 'bbActionBarItem',\n bindToController: true,\n scope: {},\n require: '?^bbActionBarItemGroup',\n transclude: true,\n restrict: 'E',\n link: function ($scope, el, attrs, groupCtrl) {\n\n function mediaBreakpointHandler(breakpoints) {\n if (breakpoints.xs) {\n if (!el.parent().is('li')) {\n el.wrap('
');\n }\n\n } else {\n if (el.parent().is('li')) {\n el.unwrap();\n }\n }\n }\n\n if (groupCtrl !== null) {\n bbMediaBreakpoints.register(mediaBreakpointHandler);\n\n $scope.$on('$destroy', function () {\n bbMediaBreakpoints.unregister(mediaBreakpointHandler);\n //get rid of wrapper on destroy\n if (el.parent().is('li')) {\n el.unwrap();\n }\n });\n }\n },\n templateUrl: 'sky/templates/actionbar/actionbaritem.html'\n };\n }\n\n bbActionBarItem.$inject = ['bbMediaBreakpoints'];\n\n angular.module('sky.actionbar', ['sky.resources', 'sky.mediabreakpoints', 'ui.bootstrap.dropdown'])\n .directive('bbActionBar', bbActionBar)\n .directive('bbActionBarItemGroup', bbActionBarItemGroup)\n .directive('bbActionBarItem', bbActionBarItem);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbAlert() {\n function Controller() {\n\n }\n\n function link(scope, el, attrs, vm) {\n vm.close = function () {\n vm.bbAlertClosed = true;\n };\n }\n\n return {\n restrict: 'E',\n controller: Controller,\n controllerAs: 'bbAlert',\n bindToController: {\n bbAlertType: '@',\n bbAlertCloseable: '@',\n bbAlertClosed: '='\n },\n link: link,\n scope: {},\n templateUrl: 'sky/templates/alert/alert.html',\n transclude: true\n };\n }\n\n angular.module('sky.alert.directive', ['sky.resources'])\n .directive('bbAlert', bbAlert);\n}());\n", "/*jshint browser: true */\n/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.autofocus', [])\n .directive('bbAutofocus', ['$timeout', function ($timeout) {\n return {\n restrict: 'A',\n link: function ($scope, $element) {\n /*jslint unparam: true */\n $timeout(function () {\n $element.focus();\n }, 500);\n }\n };\n }]);\n}());\n", "/*jslint browser: true, plusplus: true */\n/*global angular, jQuery */\n\n(function ($) {\n 'use strict';\n\n function getBaseSettings(bbAutoNumericConfig, configType) {\n var baseSettings,\n configSettings;\n\n baseSettings = angular.extend(\n {},\n $.fn.autoNumeric.defaults,\n bbAutoNumericConfig.number\n );\n\n if (configType) {\n configSettings = angular.isObject(configType) ? configType : bbAutoNumericConfig[configType];\n\n if (configSettings) {\n angular.extend(baseSettings, configSettings);\n }\n }\n\n return baseSettings;\n }\n\n angular.module('sky.autonumeric', ['sky.resources', 'sky.window'])\n .constant('bbAutonumericConfig', {\n number: {\n aSep: ',',\n dGroup: 3,\n aDec: '.',\n pSign: 'p',\n mDec: 2\n },\n money: {\n aSign: '$'\n },\n percent: {\n aSign: '%',\n pSign: 's',\n mDec: 0\n }\n })\n .directive('bbAutonumeric', ['$timeout', 'bbAutonumericConfig', 'bbWindow', '$document', function ($timeout, bbAutoNumericConfig, bbWindow, $document) {\n return {\n require: 'ngModel',\n restrict: 'A',\n link: function ($scope, el, attrs, ngModel) {\n var customSettings = {},\n isIosUserAgent = bbWindow.isIosUserAgent();\n\n function applySettings() {\n el.autoNumeric('update', angular.extend({}, getBaseSettings(bbAutoNumericConfig, attrs.bbAutonumeric), customSettings));\n }\n\n function applyCssSettings(el) {\n if (attrs.bbAutonumeric) {\n el.addClass('bb-autonumeric-' + attrs.bbAutonumeric);\n }\n }\n\n function autonumericChange() {\n return $scope.$apply(function () {\n\n var value = parseFloat(el.autoNumeric('get'));\n\n if (isNaN(value)) {\n value = null;\n }\n return ngModel.$setViewValue(value);\n });\n }\n\n if (attrs.bbAutonumericSettings) {\n $scope.$watch(attrs.bbAutonumericSettings, function (newValue) {\n customSettings = newValue || {};\n applySettings();\n }, true);\n }\n\n el.autoNumeric(getBaseSettings(bbAutoNumericConfig, attrs.bbAutonumeric));\n applyCssSettings(el);\n\n // If a valid number, update the autoNumeric value.\n // Also handles the model being updated, but being in correct (usually a paste).\n // In that case, updates the model to what the autoNumeric plugin's value.\n $scope.$watch(attrs.ngModel, function (newValue, oldValue) {\n var getValue,\n selectionStart;\n if (newValue !== undefined && newValue !== null && !isNaN(newValue)) {\n\n if (parseFloat(newValue) !== parseFloat(oldValue)) {\n\n selectionStart = el[0].selectionStart;\n }\n\n el.autoNumeric('set', newValue);\n getValue = el.autoNumeric('get');\n if (parseFloat(getValue) !== parseFloat(newValue)) {\n $timeout(autonumericChange);\n } else if (el[0] && angular.isFunction(el[0].setSelectionRange) && angular.isDefined(selectionStart)) {\n $timeout(function () {\n if ($document[0] && $document[0].activeElement === el[0]) {\n el[0].setSelectionRange(selectionStart, selectionStart);\n }\n });\n }\n } else if (newValue === null) {\n el.val(null);\n\n }\n });\n\n el.on('keydown', function (event) {\n if (event.which === 13) {\n autonumericChange();\n }\n });\n\n el.on('change paste onpaste', function () {\n autonumericChange();\n\n });\n\n // When focusing in textbox, select all. This is to workaround not having placeholder text for autonumeric.\n /*\n istanbul ignore next: the test for this code isn't passing on IE 10 on BrowserStack in automated mode.\n This isn't mission-critical so I'm just ignoring it for now.\n */\n el.on('focusin.bbAutonumeric', function () {\n $timeout(function () {\n // Check to ensure the field still has focus once the $timeout callback is executed.\n // https://github.com/blackbaud/skyux/issues/64\n if (el.is(':focus')) {\n if (!isIosUserAgent) {\n el.select();\n } else {\n //use setSelectionRange instead of select because select in a timeout does not work with iOS\n el[0].setSelectionRange(0, 9999);\n }\n }\n });\n });\n\n }\n };\n }])\n .filter('bbAutonumeric', ['bbAutonumericConfig', 'bbResources', function (bbAutonumericConfig, bbResources) {\n return function (input, configType, abbreviate) {\n var aSign,\n dividend,\n mDec,\n formatted,\n settings,\n suffix,\n tempEl;\n\n if (input === null || angular.isUndefined(input)) {\n return '';\n }\n\n if (isNaN(input)) {\n return input;\n }\n\n\n tempEl = $('');\n\n settings = getBaseSettings(bbAutonumericConfig, configType);\n\n if (abbreviate) {\n if (settings.pSign === 's') {\n // The suffix needs to go between the number and the currency symbol, so the currency\n // symbol has to be left off and appended after the number is formatted.\n aSign = settings.aSign;\n settings.aSign = '';\n }\n\n input = Math.round(input);\n\n if (input >= 1000000000) {\n dividend = 100000000;\n suffix = bbResources.autonumeric_abbr_billions;\n } else if (input >= 1000000) {\n dividend = 100000;\n suffix = bbResources.autonumeric_abbr_millions;\n } else if (input >= 10000) {\n dividend = 100;\n suffix = bbResources.autonumeric_abbr_thousands;\n }\n\n if (suffix) {\n input = Math.floor(input / dividend) / 10;\n mDec = Math.floor(input) === input ? 0 : 1;\n } else {\n mDec = 0;\n }\n\n settings.mDec = mDec;\n }\n\n tempEl.autoNumeric(settings);\n tempEl.autoNumeric('set', input);\n\n formatted = tempEl.text();\n\n if (suffix) {\n formatted += suffix;\n }\n\n if (abbreviate && settings.pSign === 's' && aSign) {\n formatted += aSign;\n }\n\n return formatted;\n };\n }]);\n}(jQuery));\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n var bbAvatarConfig = {\n maxFileSize: 500000\n };\n\n angular.module('sky.avatar.config', [])\n .constant('bbAvatarConfig', bbAvatarConfig);\n}());\n", "/*global angular, jQuery */\n\n(function ($) {\n 'use strict';\n\n function bbAvatar($filter, $templateCache, $window, bbAvatarConfig, bbErrorModal, bbFormat, bbPalette, bbResources) {\n function link(scope, el, attrs, vm) {\n var blobUrl,\n templateLoaded;\n\n function setImageUrl(url) {\n el.find('.bb-avatar-image').css('background-image', 'url(' + url + ')');\n }\n\n function getInitial(name) {\n return name.charAt(0).toUpperCase();\n }\n\n function getInitials(name) {\n var initials,\n nameSplit;\n\n if (name) {\n nameSplit = name.split(' ');\n initials = getInitial(nameSplit[0]);\n\n /* istanbul ignore else this is tested through a visual regression test */\n if (nameSplit.length > 1) {\n initials += getInitial(nameSplit[nameSplit.length - 1]);\n }\n }\n\n return initials;\n }\n\n function getPlaceholderColor(name) {\n var colorIndex,\n colors = bbPalette.getColorSequence(6),\n seed;\n\n if (name) {\n // Generate a unique-ish color based on the record name. This is deterministic\n // so that a given name will always generate the same color.\n seed = name.charCodeAt(0) + name.charCodeAt(name.length - 1) + name.length;\n colorIndex = Math.abs(seed % colors.length);\n } else {\n colorIndex = 0;\n }\n\n return colors[colorIndex];\n }\n\n function drawPlaceolderImage() {\n var canvas,\n context,\n devicePixelRatio,\n fontSize = \"46px\",\n initials,\n name,\n size = 100;\n\n name = vm.bbAvatarName;\n initials = getInitials(name);\n\n canvas = el.find('.bb-avatar-initials')[0];\n context = canvas.getContext('2d');\n\n devicePixelRatio = $window.devicePixelRatio;\n\n /* istanbul ignore else */\n if (devicePixelRatio) {\n $(canvas)\n .attr('width', size * devicePixelRatio)\n .attr('height', size * devicePixelRatio);\n\n context.scale(devicePixelRatio, devicePixelRatio);\n }\n\n context.fillStyle = getPlaceholderColor(name);\n context.fillRect(0, 0, canvas.width, canvas.height);\n\n if (initials) {\n context.font = fontSize + ' Arial';\n context.textAlign = 'center';\n context.fillStyle = '#FFF';\n context.fillText(initials, size * 0.5, size * (2 / 3));\n }\n }\n\n function revokeBlobUrl() {\n if (blobUrl) {\n $window.URL.revokeObjectURL(blobUrl);\n blobUrl = null;\n }\n }\n\n function loadPhoto() {\n var src,\n url;\n\n revokeBlobUrl();\n\n if (templateLoaded) {\n src = vm.bbAvatarSrc;\n\n if (src) {\n if (src instanceof $window.File) {\n url = $window.URL.createObjectURL(src);\n\n // Keep the last blob URL around so we can revoke it later.\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n blobUrl = url;\n } else {\n url = src;\n }\n\n setImageUrl(url);\n } else {\n drawPlaceolderImage();\n }\n }\n }\n\n function handleInvalidFileDrop(rejectedFile) {\n var errorDescription,\n errorTitle,\n maxFileSizeFormatted;\n\n if (rejectedFile.type.toUpperCase().indexOf('IMAGE/') !== 0) {\n errorDescription = bbResources.avatar_error_not_image_description;\n errorTitle = bbResources.avatar_error_not_image_title;\n } else {\n maxFileSizeFormatted = $filter('bbFileSize')(bbAvatarConfig.maxFileSize);\n\n errorDescription = bbFormat.formatText(bbResources.avatar_error_too_large_description, maxFileSizeFormatted);\n errorTitle = bbResources.avatar_error_too_large_title;\n }\n\n bbErrorModal.open({\n errorDescription: errorDescription,\n errorTitle: errorTitle\n });\n }\n\n vm.onTemplateLoad = function () {\n templateLoaded = true;\n };\n\n vm.photoDrop = function (files, rejectedFiles) {\n if (angular.isArray(rejectedFiles) && rejectedFiles.length > 0) {\n handleInvalidFileDrop(rejectedFiles[0]);\n } else {\n vm.bbAvatarChange({\n file: files[0]\n });\n }\n };\n\n vm.showInitials = function () {\n return !!(vm.bbAvatarName && !vm.bbAvatarSrc);\n };\n\n if (attrs.bbAvatarChange) {\n vm.canChange = true;\n }\n\n scope.$watch(function () {\n return templateLoaded;\n }, loadPhoto);\n\n scope.$watch(function () {\n return vm.bbAvatarSrc;\n }, loadPhoto);\n\n scope.$watch(function () {\n return vm.bbAvatarName;\n }, loadPhoto);\n\n scope.$on('$destroy', function () {\n revokeBlobUrl();\n });\n\n vm.maxFileSize = bbAvatarConfig.maxFileSize;\n }\n\n function template(el) {\n var dropEl;\n\n el.html($templateCache.get('sky/templates/avatar/avatar.directive.html'));\n\n dropEl = el.find('.bb-avatar-file-drop');\n\n dropEl.attr('bb-file-drop-max-size', bbAvatarConfig.maxFileSize);\n }\n\n return {\n scope: {},\n bindToController: {\n bbAvatarSrc: '=',\n bbAvatarName: '=',\n bbAvatarChange: '&'\n },\n controller: angular.noop,\n controllerAs: 'bbAvatar',\n link: link,\n template: template\n };\n }\n\n bbAvatar.$inject = ['$filter', '$templateCache', '$window', 'bbAvatarConfig', 'bbErrorModal', 'bbFormat', 'bbPalette', 'bbResources'];\n\n angular.module('sky.avatar.directive', ['sky.avatar.config', 'sky.error', 'sky.format', 'sky.palette', 'sky.resources'])\n .directive('bbAvatar', bbAvatar);\n}(jQuery));\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n var components = [{\n name: 'Title',\n cls: 'title'\n }, {\n name: 'Content',\n cls: 'content'\n }, {\n name: 'Actions',\n cls: 'actions'\n }],\n cardModule = angular.module('sky.card.directive', ['sky.check']),\n nextId = 0;\n\n function makeCardComponent(component) {\n var controllerName,\n name = component.name;\n\n function Controller($scope) {\n var vm = this;\n\n $scope.$on('$destroy', function () {\n vm.onDestroy();\n vm = null;\n });\n }\n\n Controller.$inject = ['$scope'];\n\n function componentFn() {\n function link(scope, el, attrs, ctrls) {\n var vm = ctrls[0],\n bbCard = ctrls[1];\n\n vm.el = el;\n\n bbCard['set' + name](vm);\n }\n\n return {\n restrict: 'E',\n require: ['bbCard' + name, '^bbCard'],\n controller: controllerName,\n controllerAs: 'bbCard' + name,\n bindToController: true,\n link: link,\n scope: {}\n };\n }\n\n controllerName = 'BBCard' + name + 'Controller';\n\n cardModule\n .controller(controllerName, Controller)\n .directive('bbCard' + name, componentFn);\n }\n\n function getCtrlPropName(component) {\n var name = component.name;\n\n return name.charAt(0).toLowerCase() + name.substr(1) + 'Ctrl';\n }\n\n function BBCardController() {\n var vm = this;\n\n function addComponentSetter(component) {\n var name = component.name;\n\n vm['set' + name] = function (ctrl) {\n var propName = getCtrlPropName(component);\n\n vm[propName] = ctrl;\n\n ctrl.onDestroy = function () {\n vm[propName] = null;\n };\n };\n }\n\n components.forEach(addComponentSetter);\n\n vm.getClass = function () {\n var cls = [];\n\n switch (vm.bbCardSize) {\n case 'small':\n cls.push('bb-card-small');\n break;\n }\n\n if (vm.bbCardSelectable) {\n cls.push('bb-card-selectable');\n\n if (vm.bbCardSelected) {\n cls.push('bb-card-selected');\n }\n }\n\n return cls;\n };\n\n nextId++;\n vm.cardCheckId = 'bb-card-check-' + nextId;\n }\n\n function bbCard() {\n function link(scope, el, attrs, vm) {\n function watchForComponent(component) {\n scope.$watch(function () {\n return vm[getCtrlPropName(component)];\n }, function (newValue) {\n if (newValue) {\n el.find('.bb-card-' + component.cls)\n .empty()\n .append(newValue.el);\n }\n });\n }\n\n components.forEach(watchForComponent);\n }\n\n return {\n bindToController: {\n bbCardSelectable: '@?',\n bbCardSelected: '=?',\n bbCardSize: '@?'\n },\n controller: 'BBCardController',\n controllerAs: 'bbCard',\n link: link,\n restrict: 'E',\n scope: {},\n templateUrl: 'sky/templates/card/card.directive.html',\n transclude: true\n };\n }\n\n cardModule\n .controller('BBCardController', BBCardController)\n .directive('bbCard', bbCard);\n\n components.forEach(makeCardComponent);\n}());\n", "/*jshint browser: true */\n/*global angular */\n\n(function () {\n 'use strict';\n angular.module('sky.check', [])\n .directive('bbCheck', ['$templateCache', function ($templateCache) {\n function createEl(name) {\n return angular.element($templateCache.get('sky/templates/check/' + name + '.html'));\n }\n\n return {\n link: function (scope, el, attr) {\n var labelEl = el.parent('label'),\n styledEl,\n typeClass;\n\n if (labelEl.length < 1) {\n el.wrap(createEl('wrapper'));\n } else {\n labelEl.addClass('bb-check-wrapper');\n\n /* wrap non-whitespace label text to set\n vertical-align middle properly */ \n labelEl.contents()\n .filter(function () {\n return this.nodeType === 3 && /\\S/.test(this.textContent);\n })\n .wrap(createEl('labeltext'));\n\n }\n if (attr.type === 'radio') {\n typeClass = 'bb-check-radio';\n } else {\n typeClass = 'bb-check-checkbox';\n }\n\n styledEl = createEl('styled');\n styledEl.addClass(typeClass);\n\n el.after(styledEl);\n }\n };\n }]);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n var SEARCH_PROPS = ['title', 'description'];\n\n function BBChecklistController($scope, bbChecklistUtility) {\n var vm = this;\n\n function itemMatchesCategory(item, category) {\n return !category || item.category === category;\n }\n\n function itemInSubset(item, subsetSelected) {\n if (!vm.bbChecklistSubsetLabel || angular.isUndefined(item[vm.bbChecklistSubsetProperty]) || item[vm.bbChecklistSubsetProperty] === false) {\n return true;\n }\n\n if (vm.subsetExclude) {\n return item[vm.bbChecklistSubsetProperty] !== subsetSelected;\n } else {\n return item[vm.bbChecklistSubsetProperty] === subsetSelected;\n }\n\n }\n\n function itemIsSelected(item) {\n return bbChecklistUtility.contains(vm.bbChecklistSelectedItems, item);\n }\n\n\n function itemMatchesFilter(item, category, searchTextUpper) {\n var i,\n p,\n len,\n val;\n\n\n if (itemMatchesCategory(item, category)) {\n if (itemInSubset(item, vm.subsetSelected)) {\n if (!searchTextUpper) {\n return true;\n }\n\n for (i = 0, len = SEARCH_PROPS.length; i < len; i++) {\n p = SEARCH_PROPS[i];\n if (item.hasOwnProperty(p)) {\n val = item[p];\n\n if (angular.isString(val) && val.toUpperCase().indexOf(searchTextUpper) >= 0) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n }\n\n function invokeFilterLocal() {\n var filteredItems,\n i,\n item,\n items = vm.bbChecklistItems,\n n,\n searchTextUpper = (vm.searchText || '').toUpperCase(),\n selectedCategory = vm.selectedCategory;\n\n if (!searchTextUpper && !selectedCategory && !vm.bbChecklistSubsetLabel && !vm.onlyShowSelected) {\n filteredItems = items.slice(0);\n } else {\n filteredItems = [];\n\n for (i = 0, n = items.length; i < n; i++) {\n item = items[i];\n\n if (itemMatchesFilter(item, selectedCategory, searchTextUpper)) {\n filteredItems.push(item);\n }\n }\n }\n\n vm.filteredItems = filteredItems;\n }\n\n function invokeFilter() {\n /* When the show only selected items checkbox is checked,\n then no other filters should be applied */\n if (vm.onlyShowSelected) {\n vm.filteredItems = vm.bbChecklistSelectedItems || [];\n } else if (vm.filterLocal) {\n invokeFilterLocal();\n } else if (vm.bbChecklistFilterCallback) {\n vm.bbChecklistFilterCallback({\n searchText: vm.searchText,\n category: vm.selectedCategory,\n subsetSelected: vm.subsetSelected\n });\n }\n }\n\n function eachFilteredItem(callback) {\n var filteredItemsCopy = angular.copy(vm.filteredItems);\n filteredItemsCopy.forEach(callback);\n }\n\n function selectItem(item) {\n bbChecklistUtility.add(vm.bbChecklistSelectedItems, item);\n }\n\n function unselectItem(item) {\n bbChecklistUtility.remove(vm.bbChecklistSelectedItems, item);\n }\n\n vm.bbChecklistSelectedItems = vm.bbChecklistSelectedItems || [];\n vm.itemIsSelected = itemIsSelected;\n\n vm.selectAll = function () {\n eachFilteredItem(selectItem);\n };\n\n vm.clear = function () {\n eachFilteredItem(unselectItem);\n };\n\n vm.rowClicked = function (item) {\n if (!itemIsSelected(item)) {\n selectItem(item);\n } else {\n unselectItem(item);\n }\n };\n\n vm.isSingleSelect = function () {\n return vm.bbChecklistSelectStyle === 'single';\n };\n\n vm.getChecklistCls = function () {\n return {\n 'bb-checklist-single': vm.isSingleSelect()\n };\n };\n\n vm.getRowCls = function (item) {\n return {\n 'bb-checklist-row-selected': itemIsSelected(item)\n };\n };\n\n vm.singleSelectRowClick = function (item) {\n vm.bbChecklistSelectedItems = [item];\n\n $scope.$emit('bbPickerSelected', {\n selectedItems: vm.bbChecklistSelectedItems\n });\n };\n\n /* In grid view, ensure that clicking input does not also cause the\n row click function to be called */\n vm.inputClicked = function ($event) {\n $event.stopPropagation();\n };\n\n vm.setColumns = function (columns) {\n vm.columns = columns;\n };\n\n $scope.$watch(function () {\n return vm.bbChecklistItems;\n }, function () {\n vm.filteredItems = vm.bbChecklistItems;\n vm.highlightRefresh = new Date().getTime();\n });\n\n $scope.$watch(function () {\n return vm.searchText;\n }, function (newValue, oldValue) {\n if (newValue !== oldValue) {\n invokeFilter();\n }\n });\n\n if (angular.isDefined(vm.bbChecklistCategories)) {\n vm.allCategories = 'bbChecklistAllCategories';\n vm.selectedOption = vm.allCategories;\n $scope.$watch(function () {\n return vm.selectedOption;\n }, function (newValue, oldValue) {\n if (newValue === vm.allCategories) {\n vm.selectedCategory = null;\n } else {\n vm.selectedCategory = newValue;\n }\n if (newValue !== oldValue) {\n invokeFilter();\n }\n });\n }\n\n if (angular.isDefined(vm.bbChecklistSubsetLabel)) {\n $scope.$watch(function () {\n return vm.subsetSelected;\n }, function () {\n invokeFilter();\n });\n }\n\n $scope.$watch(function () {\n return vm.onlyShowSelected;\n }, function () {\n invokeFilter();\n });\n\n\n $scope.$emit('bbPickerReady', {\n setSelectedItems: function (selectedItems) {\n vm.bbChecklistSelectedItems = selectedItems;\n }\n });\n\n\n }\n\n BBChecklistController.$inject = ['$scope', 'bbChecklistUtility'];\n\n angular.module('sky.checklist.controller', ['sky.checklist.utility'])\n .controller('BBChecklistController', BBChecklistController);\n}());\n", "/*jslint browser: true */\n/*global angular */\n\n(function () {\n 'use strict';\n\n function bbChecklist() {\n return {\n replace: true,\n restrict: 'E',\n transclude: true,\n templateUrl: 'sky/templates/checklist/checklist.directive.html',\n bindToController: {\n bbChecklistItems: '=',\n bbChecklistSelectedItems: '=?',\n bbChecklistFilterCallback: '=?',\n bbChecklistIncludeSearch: '=?',\n bbChecklistSearchDebounce: '=?',\n bbChecklistSearchPlaceholder: '@',\n bbChecklistNoItemsMessage: '@',\n bbChecklistAutomationField: '=?',\n bbChecklistCategories: '=?',\n bbChecklistMode: '@?',\n bbChecklistSelectStyle: '@?',\n bbChecklistIsLoading: '=?',\n bbChecklistSubsetLabel: '=?',\n bbChecklistSubsetProperty: '@?'\n },\n controller: 'BBChecklistController',\n controllerAs: 'bbChecklist',\n scope: {},\n link: function (scope, el, attrs, vm) {\n vm.filterLocal = angular.isDefined(attrs.bbChecklistFilterLocal);\n vm.subsetExclude = angular.isDefined(attrs.bbChecklistSubsetExclude);\n vm.focusSearch = attrs.bbChecklistFocusSearch;\n vm.onlySelectedAvailable = angular.isDefined(attrs.bbChecklistOnlySelected);\n }\n };\n }\n\n angular.module(\n 'sky.checklist.directive',\n [\n 'sky.check',\n 'sky.checklist.controller',\n 'sky.resources',\n 'sky.wait'\n ]\n )\n .directive('bbChecklist', bbChecklist);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbChecklistColumn() {\n return {\n require: ['bbChecklistColumn', '^bbChecklistColumns'],\n restrict: 'E',\n bindToController: {\n bbChecklistColumnCaption: \"=\",\n bbChecklistColumnField: \"=\",\n bbChecklistColumnClass: \"=\",\n bbChecklistColumnWidth: \"=\",\n bbChecklistColumnAutomationId: \"=\"\n },\n controller: function () {},\n controllerAs: 'bbChecklistColumn',\n scope: {},\n link: function ($scope, element, attrs, ctrls) {\n var bbChecklistColumns = ctrls[1],\n column,\n vm = ctrls[0];\n\n column = {\n caption: vm.bbChecklistColumnCaption,\n field: vm.bbChecklistColumnField,\n 'class': vm.bbChecklistColumnClass,\n width: vm.bbChecklistColumnWidth,\n automationId: vm.bbChecklistColumnAutomationId\n };\n\n bbChecklistColumns.addColumn(column);\n }\n };\n }\n\n angular.module('sky.checklist.column.directive', ['sky.checklist.columns.directive'])\n .directive('bbChecklistColumn', bbChecklistColumn);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function BBChecklistColumnsController() {\n var vm = this;\n\n vm.columns = [];\n\n vm.addColumn = function (column) {\n vm.columns.push(column);\n };\n }\n\n angular.module('sky.checklist.columns.controller', [])\n .controller('BBChecklistColumnsController', BBChecklistColumnsController);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbChecklistColumns() {\n function link($scope, element, attrs, ctrls) {\n var bbChecklist = ctrls[1],\n vm = ctrls[0];\n\n bbChecklist.setColumns(vm.columns);\n }\n\n return {\n require: ['bbChecklistColumns', '^bbChecklist'],\n restrict: 'E',\n scope: {},\n bindToController: {},\n controller: 'BBChecklistColumnsController',\n controllerAs: 'bbChecklistColumns',\n link: link\n };\n }\n\n angular.module('sky.checklist.columns.directive', ['sky.checklist.columns.controller'])\n .directive('bbChecklistColumns', bbChecklistColumns);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function checklistModel($compile, $parse, bbChecklistUtility) {\n // http://stackoverflow.com/a/19228302/1458162\n function postLinkFn(scope, elem, attrs) {\n var getter,\n setter,\n value;\n\n // compile with `ng-model` pointing to `checked`\n $compile(elem)(scope);\n\n // getter / setter for original model\n getter = $parse(attrs.checklistModel);\n setter = getter.assign;\n\n // value added to list\n value = $parse(attrs.checklistValue)(scope.$parent);\n\n // watch UI checked change\n scope.$watch('checked', function (newValue, oldValue) {\n var current;\n\n if (newValue === oldValue) {\n return;\n }\n\n current = getter(scope.$parent);\n\n if (newValue === true) {\n setter(scope.$parent, bbChecklistUtility.add(current, value));\n } else {\n setter(scope.$parent, bbChecklistUtility.remove(current, value));\n }\n });\n\n // watch original model change\n scope.$parent.$watch(attrs.checklistModel, function (newArr) {\n scope.checked = bbChecklistUtility.contains(newArr, value);\n }, true);\n }\n\n return {\n restrict: 'A',\n priority: 1000,\n terminal: true,\n scope: true,\n compile: function (tElement, tAttrs) {\n if (tElement[0].tagName !== 'INPUT' || !tElement.attr('type', 'checkbox')) {\n throw 'checklist-model should be applied to `input[type=\"checkbox\"]`.';\n }\n\n if (!tAttrs.checklistValue) {\n throw 'You should provide `checklist-value`.';\n }\n\n // exclude recursion\n tElement.removeAttr('checklist-model');\n\n // local scope var storing individual checkbox model\n tElement.attr('ng-model', 'checked');\n\n return postLinkFn;\n }\n };\n }\n\n checklistModel.$inject = ['$compile', '$parse', 'bbChecklistUtility'];\n\n angular.module('sky.checklist.model.directive', ['sky.checklist.utility'])\n .directive('checklistModel', checklistModel);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.checklist.utility', [])\n .factory('bbChecklistUtility', function () {\n return {\n\n contains: function (arr, item) {\n var i;\n\n if (angular.isArray(arr)) {\n for (i = 0; i < arr.length; i += 1) {\n if (angular.equals(arr[i], item)) {\n return true;\n }\n }\n }\n return false;\n },\n\n // add\n add: function (arr, item, isSingleSelect) {\n var i;\n\n arr = !isSingleSelect && angular.isArray(arr) ? arr : [];\n for (i = 0; i < arr.length; i += 1) {\n if (angular.equals(arr[i], item)) {\n return arr;\n }\n }\n arr.push(item);\n return arr;\n },\n\n // remove\n remove: function (arr, item) {\n var i;\n\n if (angular.isArray(arr)) {\n for (i = 0; i < arr.length; i += 1) {\n if (angular.equals(arr[i], item)) {\n arr.splice(i, 1);\n break;\n }\n }\n }\n return arr;\n }\n\n };\n });\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function BBChevronController(bbResources) {\n var vm = this;\n\n function getDirection() {\n return vm.bbChevronDirection || 'up';\n }\n\n vm.getCls = function () {\n return 'bb-chevron-flip-' + getDirection();\n };\n\n vm.getLabel = function () {\n return bbResources['chevron_' + (getDirection() === 'up' ? 'collapse' : 'expand')];\n };\n\n vm.click = function ($event) {\n $event.stopPropagation();\n\n vm.bbChevronDirection = (getDirection() === 'up' ? 'down' : 'up');\n };\n }\n\n BBChevronController.$inject = ['bbResources'];\n\n angular.module('sky.chevron.controller', ['sky.resources'])\n .controller('BBChevronController', BBChevronController);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbChevron() {\n return {\n bindToController: {\n bbChevronDirection: '=?'\n },\n controller: 'BBChevronController',\n controllerAs: 'bbChevron',\n scope: {},\n templateUrl: 'sky/templates/chevron/chevron.directive.html'\n };\n }\n\n angular.module('sky.chevron.directive', ['sky.chevron.controller'])\n .directive('bbChevron', bbChevron);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function BBContextMenuButtonController(bbResources) {\n var vm = this;\n\n vm.getAriaLabel = function () {\n var ariaLabel;\n\n if (vm.bbContextMenu) {\n ariaLabel = vm.bbContextMenu.getAriaLabel();\n }\n\n if (!ariaLabel) {\n ariaLabel = vm.bbContextMenuButtonLabel || bbResources.context_menu_default_label;\n }\n\n return ariaLabel;\n };\n }\n\n BBContextMenuButtonController.$inject = ['bbResources'];\n\n angular.module('sky.contextmenu.button.controller', ['sky.resources'])\n .controller('BBContextMenuButtonController', BBContextMenuButtonController);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbContextMenuButton() {\n function link(scope, el, attrs, ctrls) {\n var bbContextMenu = ctrls[1],\n vm = ctrls[0];\n\n vm.bbContextMenu = bbContextMenu;\n }\n\n return {\n bindToController: {\n bbContextMenuButtonLabel: '@'\n },\n controller: 'BBContextMenuButtonController',\n controllerAs: 'bbContextMenuButton',\n link: link,\n restrict: 'E',\n replace: true,\n require: ['bbContextMenuButton', '?^bbContextMenu'],\n scope: {},\n templateUrl: 'sky/templates/contextmenu/menubutton.html'\n };\n }\n\n angular.module(\n 'sky.contextmenu.button.directive',\n [\n 'sky.contextmenu.button.controller',\n 'sky.resources'\n ]\n )\n .directive('bbContextMenuButton', bbContextMenuButton);\n}());\n", "/* global angular */\n\n(function () {\n 'use strict';\n\n function BBContextMenuController() {\n var vm = this;\n\n vm.contextButtonStopPropagation = function ($event) {\n $event.stopPropagation();\n };\n\n vm.getAriaLabel = function () {\n return vm.bbContextMenuLabel;\n };\n }\n\n angular.module('sky.contextmenu.controller', [])\n .controller('BBContextMenuController', BBContextMenuController);\n}());\n", "/* global angular */\n\n(function () {\n 'use strict';\n\n function bbContextMenu() {\n return {\n bindToController: {\n bbContextMenuLabel: '@'\n },\n controller: 'BBContextMenuController',\n controllerAs: 'bbContextMenu',\n replace: true,\n restrict: 'E',\n scope: {},\n transclude: true,\n templateUrl: 'sky/templates/contextmenu/contextmenu.html'\n };\n }\n\n angular.module('sky.contextmenu.directive', ['ui.bootstrap.dropdown', 'ui.bootstrap.accordion', 'sky.contextmenu.controller'])\n .directive('bbContextMenu', bbContextMenu);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbContextMenuItem() {\n return {\n bindToController: {\n clickItem: '&bbContextMenuAction'\n },\n controller: angular.noop,\n controllerAs: 'bbContextMenuItem',\n restrict: 'E',\n transclude: true,\n replace: true,\n scope: {},\n templateUrl: 'sky/templates/contextmenu/menuitem.html'\n };\n }\n\n angular.module('sky.contextmenu.item.directive', [])\n .directive('bbContextMenuItem', bbContextMenuItem);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbContextMenuToggleAccordion() {\n return function ($event, vm) {\n $event.preventDefault();\n $event.stopPropagation();\n vm.accordionOpen = !vm.accordionOpen;\n };\n }\n\n angular.module('sky.contextmenu.toggleaccordion.factory', [])\n .factory('bbContextMenuToggleAccordion', bbContextMenuToggleAccordion);\n\n}());\n", "/* global angular */\n\n(function () {\n 'use strict';\n\n function bbSubmenu(bbContextMenuToggleAccordion) {\n return {\n bindToController: {\n heading: '=?bbSubmenuHeading'\n },\n controller: angular.noop,\n controllerAs: 'bbSubmenu',\n restrict: 'E',\n scope: {},\n link: function (scope, el, attrs, vm) {\n vm.accordionOpen = false;\n vm.staticHeader = false;\n\n if (angular.isDefined(attrs.bbSubmenuHeading)) {\n vm.staticHeader = true;\n }\n\n vm.toggleAccordion = function ($event) {\n bbContextMenuToggleAccordion($event, vm);\n };\n },\n transclude: true,\n templateUrl: 'sky/templates/contextmenu/submenu.html'\n };\n }\n\n bbSubmenu.$inject = ['bbContextMenuToggleAccordion'];\n\n angular.module(\n 'sky.submenu.directive',\n [\n 'sky.submenu.heading.directive',\n 'sky.contextmenu.toggleaccordion.factory',\n 'ui.bootstrap.dropdown',\n 'ui.bootstrap.accordion'\n ]\n )\n .directive('bbSubmenu', bbSubmenu);\n}());\n", "/* global angular */\n\n(function () {\n 'use strict';\n\n function bbSubmenuHeading() {\n return {\n bindToController: true,\n controller: angular.noop,\n controllerAs: 'bbSubmenuHeading',\n restrict: 'E',\n require: ['bbSubmenuHeading', '^bbSubmenu'],\n scope: true,\n link: function ($scope, el, attrs, ctrls) {\n var submenuCtrl = ctrls[1],\n vm = ctrls[0];\n\n vm.toggleAccordion = function ($event) {\n submenuCtrl.toggleAccordion($event);\n };\n },\n transclude: true,\n templateUrl: 'sky/templates/contextmenu/submenuheading.html'\n };\n }\n\n angular.module('sky.submenu.heading.directive', [])\n .directive('bbSubmenuHeading', bbSubmenuHeading);\n}());\n", "/*global angular, jQuery, require */\n\n(function ($) {\n 'use strict';\n\n var DEFAULT_PROP = '__DEFAULT__',\n REQUEST_TYPE_DATA = 0,\n REQUEST_TYPE_RESOURCES = 1,\n REQUEST_TYPE_TEXT = 2;\n\n function fillUrls(option, props, urls) {\n var item,\n p,\n url;\n\n /*istanbul ignore else: sanity check */\n if (option) {\n if (angular.isString(option) || option.BB_DATA_POST) {\n url = option;\n\n option = {};\n option[DEFAULT_PROP] = url;\n }\n\n for (p in option) {\n /*istanbul ignore else */\n if (option.hasOwnProperty(p)) {\n item = option[p];\n url = item;\n\n props.push(p);\n urls.push(url);\n }\n }\n }\n }\n\n function loadManager(options) {\n // A service endpoint for tracking loading items.\n\n var item,\n loadingItems = [],\n nonblockingForAdditionalItems = false,\n result,\n scope,\n waitingForFirstItem = false;\n\n function cancelWaiting() {\n options.waitForFirstItem = false;\n options.nonblockWaitForAdditionalItems = false;\n\n if (nonblockingForAdditionalItems) {\n nonblockingForAdditionalItems = false;\n scope.$emit(\"bbEndWait\", { nonblocking: true });\n }\n\n if (waitingForFirstItem) {\n waitingForFirstItem = false;\n scope.$emit(\"bbEndWait\");\n }\n }\n\n function startNonblockingForAdditionalItems() {\n nonblockingForAdditionalItems = true;\n scope.$emit(\"bbBeginWait\", { nonblocking: true });\n }\n\n function markCompleted(item) {\n var i = loadingItems.indexOf(item);\n\n if (i !== -1) {\n loadingItems.splice(i, 1);\n if (loadingItems.length === 0) {\n result.isLoading = false;\n\n if (nonblockingForAdditionalItems) {\n nonblockingForAdditionalItems = false;\n scope.$emit(\"bbEndWait\", { nonblocking: true });\n }\n }\n }\n\n if (!result.isFirstItemLoaded) {\n result.isFirstItemLoaded = true;\n if (waitingForFirstItem) {\n waitingForFirstItem = false;\n scope.$emit(\"bbEndWait\");\n }\n }\n\n if (result.isLoading && options.nonblockWaitForAdditionalItems && !nonblockingForAdditionalItems) {\n startNonblockingForAdditionalItems();\n }\n }\n\n function registerItem(item) {\n if (!result.isLoading) {\n if (result.isFirstItemLoaded && options.nonblockWaitForAdditionalItems) {\n startNonblockingForAdditionalItems();\n }\n }\n loadingItems.push(item);\n result.isLoading = true;\n }\n\n // Initialize values\n scope = options.scope;\n\n if (options.load) {\n item = {\n name: options.name,\n load: options.load\n };\n }\n\n result = {\n isFirstItemLoaded: false,\n isLoading: false,\n loadingItems: loadingItems,\n cancelWaiting: cancelWaiting\n };\n\n if (options.waitForFirstItem) {\n waitingForFirstItem = true;\n scope.$emit(\"bbBeginWait\");\n }\n\n // Start loading any item that is handed directly to the loader.\n if (item) {\n // Add the current item to the list.\n registerItem(item);\n\n // Start loading the item.\n result.loaded = item.load().finally(function () {\n markCompleted(item);\n scope.$parent.$emit(\"bbData.loadManager.markCompleted\", item);\n });\n\n scope.$parent.$emit(\"bbData.loadManager.registerItem\", item);\n }\n\n if (options.isAggregate) {\n // Listen to items being registered by child loadManagers.\n scope.$on(\"bbData.loadManager.registerItem\", function (e, item) {\n e.stopPropagation();\n registerItem(item);\n });\n\n // Listen to items being marked completed by child loadManagers.\n scope.$on(\"bbData.loadManager.markCompleted\", function (e, item) {\n e.stopPropagation();\n markCompleted(item);\n });\n }\n\n return result;\n }\n\n function bbData($http, $q, $templateCache, bbDataConfig, $window) {\n function ajaxUrl(url, requestType) {\n var filter,\n parts;\n\n requestType = requestType || 0;\n\n if ($window.define && $window.define.amd && $window.require) {\n parts = url.split('?');\n\n // Grab the portion before the query string and get the fully-qualified URL.\n url = parts.shift();\n url = require.toUrl(url);\n\n // If there was anything after the first question mark, put it back.\n url += '?' + parts.join('');\n }\n\n switch (requestType) {\n case REQUEST_TYPE_DATA:\n filter = bbDataConfig.dataUrlFilter;\n break;\n case REQUEST_TYPE_RESOURCES:\n filter = bbDataConfig.resourceUrlFilter;\n break;\n case REQUEST_TYPE_TEXT:\n filter = bbDataConfig.textUrlFilter;\n break;\n }\n\n if (angular.isFunction(filter)) {\n url = filter(url);\n }\n\n return url;\n }\n\n function createAjaxPromise(item, isPost, requestType, timeoutPromise) {\n var data,\n httpOptions,\n isGet,\n textContent,\n type,\n url;\n\n requestType = requestType || 0;\n\n if (item.BB_DATA_POST || isPost) {\n data = item.data;\n type = item.type || 'post';\n url = item.url;\n } else {\n type = 'get';\n url = item;\n isGet = true;\n }\n\n if (isGet && requestType === REQUEST_TYPE_TEXT) {\n // Check the Angular template cache using the raw URL first in case the text content is compiled into\n // the module bundle.\n textContent = $templateCache.get(url);\n\n if (textContent) {\n return $q(function (resolve) {\n resolve({\n data: textContent\n });\n });\n }\n }\n\n url = ajaxUrl(url, requestType);\n\n httpOptions = {\n method: type,\n url: url,\n cache: requestType !== 0,\n data: data ? JSON.stringify(data) : null,\n dataType: requestType !== 0 ? 'text' : 'json',\n withCredentials: requestType === 0,\n timeout: timeoutPromise\n };\n\n if (data instanceof $window.FormData) {\n // Angular sets the Content-Type to application/json by default, but when posting FormData\n // it should clear out the Content-Type and let the browser determine it.\n // https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs\n angular.extend(httpOptions, {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': undefined\n }\n });\n }\n\n return $http(httpOptions);\n }\n\n function addPromises(items, urls, requestType, timeoutPromise) {\n var i,\n n,\n url;\n\n if (urls) {\n for (i = 0, n = urls.length; i < n; i++) {\n url = urls[i];\n items.push(createAjaxPromise(url, null, requestType, timeoutPromise));\n }\n }\n }\n\n function nextId() {\n nextId.index = nextId.index || 0;\n nextId.index++;\n return nextId.index;\n }\n\n function trackHTTPTimeoutForPromise(fn) {\n var id = nextId(),\n promise,\n httpTimeout = $q.defer();\n\n trackHTTPTimeoutForPromise[id] = httpTimeout;\n\n promise = fn(httpTimeout.promise);\n promise._id = id;\n\n function clearPromiseId() {\n delete trackHTTPTimeoutForPromise[id];\n }\n\n promise.then(clearPromiseId, clearPromiseId);\n\n return promise;\n }\n\n function loadData(options) {\n return trackHTTPTimeoutForPromise(function (timeoutPromise) {\n return $q(function (resolve, reject) {\n var dataOption,\n dataProps,\n dataUrls,\n resourcesOption,\n resourcesProps,\n resourcesUrls,\n promises = [],\n textOption,\n textProps,\n textUrls;\n\n function success(args) {\n var argIndex = 0,\n result = {\n httpResults: {}\n };\n\n function addResult(name, props) {\n var resultData,\n httpResult,\n i,\n n,\n p,\n resultItem,\n resultItemHttpResults;\n\n if (props) {\n for (i = 0, n = props.length; i < n; i++) {\n p = props[i];\n httpResult = args[argIndex];\n resultData = httpResult.data;\n\n if (p === DEFAULT_PROP) {\n resultItem = resultData;\n resultItemHttpResults = httpResult;\n } else {\n resultItem = resultItem || {};\n resultItem[p] = resultData;\n\n resultItemHttpResults = resultItemHttpResults || {};\n resultItemHttpResults[p] = httpResult;\n }\n\n argIndex++;\n }\n }\n\n if (angular.isDefined(resultItem)) {\n result[name] = resultItem;\n }\n\n if (angular.isDefined(resultItemHttpResults)) {\n result.httpResults[name] = resultItemHttpResults;\n }\n }\n\n addResult('data', dataProps, true);\n addResult('resources', resourcesProps);\n addResult('text', textProps);\n\n resolve(result);\n }\n\n function failure() {\n /*jshint validthis: true */\n reject.apply(this, arguments);\n }\n\n dataOption = options.data;\n resourcesOption = options.resources;\n textOption = options.text;\n\n if (dataOption) {\n dataProps = [];\n dataUrls = [];\n fillUrls(dataOption, dataProps, dataUrls);\n }\n\n if (resourcesOption) {\n resourcesProps = [];\n resourcesUrls = [];\n fillUrls(resourcesOption, resourcesProps, resourcesUrls);\n }\n\n if (textOption) {\n textProps = [];\n textUrls = [];\n fillUrls(textOption, textProps, textUrls);\n }\n\n addPromises(promises, dataUrls, REQUEST_TYPE_DATA, timeoutPromise);\n addPromises(promises, resourcesUrls, REQUEST_TYPE_RESOURCES, timeoutPromise);\n addPromises(promises, textUrls, REQUEST_TYPE_TEXT, timeoutPromise);\n\n $q.all(promises)\n .then(success)\n .catch(failure);\n });\n });\n }\n\n return {\n cancel: function (promise) {\n if (promise && promise._id && trackHTTPTimeoutForPromise[promise._id]) {\n trackHTTPTimeoutForPromise[promise._id].resolve();\n }\n },\n load: function (options) {\n if (options.loadManager) {\n options.loadManager.load = function () {\n return loadData(options);\n };\n\n return loadManager(options.loadManager).loaded;\n }\n\n return loadData(options);\n },\n loadManager: loadManager,\n query: function (url, params) {\n return url + '?' + $.param(params);\n },\n post: function (url, data) {\n return {\n url: url,\n data: data,\n BB_DATA_POST: true\n };\n },\n save: function (options) {\n return trackHTTPTimeoutForPromise(function (timeoutPromise) {\n return createAjaxPromise(options, true, null, timeoutPromise);\n });\n }\n };\n }\n\n bbData.$inject = ['$http', '$q', '$templateCache', 'bbDataConfig', '$window'];\n\n angular.module('sky.data', [])\n .constant('bbDataConfig', {})\n .factory('bbData', bbData);\n}(jQuery));\n", "/*jshint browser: true */\n/*global angular, jQuery */\n\n(function ($) {\n 'use strict';\n angular.module('sky.datepicker', ['sky.resources', 'sky.moment', 'ui.bootstrap.datepicker'])\n .constant('bbDatepickerConfig', {\n currentCultureDateFormatString: 'MM/dd/yyyy',\n showWeeks: false,\n startingDay: 0,\n minDate: '',\n maxDate: ''\n })\n .directive('bbDatepicker', ['bbResources', 'bbDatepickerConfig', 'bbDatepickerParser', '$timeout', '$q', function (bbResources, bbDatepickerConfig, bbDatepickerParser, $timeout, $q) {\n return {\n replace: true,\n restrict: 'E',\n require: 'ngModel',\n scope: {\n date: '=ngModel',\n dateOptions: '=?bbDateOptions',\n customValidation: '=?bbCustomValidation',\n format: '=?bbDateFormat',\n maxDate: '=?maxDate',\n minDate: '=?minDate',\n placeholderText: '=?placeholder'\n },\n templateUrl: 'sky/templates/datepicker/datepicker.html',\n controller: ['$scope', function ($scope) {\n var self = this;\n\n\n $scope.getInputNgModel = function () {\n if (angular.isFunction(self.getInputNgModel)) {\n return self.getInputNgModel();\n } else {\n return null;\n }\n };\n }],\n link: function ($scope, el, attr, ngModel) {\n var parsedDate,\n inputEl,\n skipValidation = false,\n dateChangeInternal = false;\n\n function getBodyDatepicker() {\n return $('body > ul[uib-datepicker-popup-wrap]');\n }\n\n function positionAbsoluteDatepicker() {\n var calendarButtonEl = el.find('span.bb-datepicker-button-container'),\n inputEl = el.find('input'),\n datepickerScope = el.find('input').isolateScope(),\n datepickerEl = getBodyDatepicker(),\n inputWidth,\n buttonWidth,\n datepickerWidth;\n\n inputWidth = inputEl.innerWidth();\n buttonWidth = calendarButtonEl.innerWidth();\n datepickerWidth = datepickerEl.innerWidth();\n\n if (datepickerWidth < (inputWidth + buttonWidth)) {\n datepickerScope.position.left = datepickerScope.position.left + inputWidth + buttonWidth - datepickerWidth;\n }\n }\n\n function open($event) {\n $event.preventDefault();\n $event.stopPropagation();\n\n //add syle class when datepicker appended to body because necessary bb-datefield class will no longer be wrapping it.\n if ($scope.locals.appendToBody) {\n $timeout(function () {\n getBodyDatepicker().addClass('bb-datefield');\n positionAbsoluteDatepicker();\n });\n }\n\n $scope.locals.opened = !$scope.locals.opened;\n }\n\n function setDate() {\n var inputNgModel;\n if (angular.isDate($scope.date)) {\n $scope.locals.date = $scope.date;\n } else if (!$scope.locals.hasCustomValidation) {\n parsedDate = bbDatepickerParser.runParsers($scope.date, $scope.format);\n if (angular.isDate(parsedDate)) {\n $scope.date = parsedDate;\n $scope.locals.date = parsedDate;\n } else {\n $scope.locals.date = $scope.date;\n inputNgModel = $scope.getInputNgModel();\n if (inputNgModel && !inputNgModel.$validators.date($scope.date)) {\n inputNgModel.invalidFormatMessage = bbResources.date_field_invalid_date_message;\n inputNgModel.$setValidity('dateFormat', false);\n }\n }\n } else {\n $scope.locals.date = $scope.date;\n }\n }\n\n $scope.locals = {\n showButtonBar: false,\n appendToBody: false,\n date: '',\n opened: false,\n open: open,\n loaded: false,\n closeOnSelection: true,\n dateOptions: {\n showWeeks: bbDatepickerConfig.showWeeks,\n startingDay: bbDatepickerConfig.startingDay\n },\n hasCustomValidation: false,\n inputName: attr.bbDatepickerName\n };\n\n if (!$scope.maxDate && bbDatepickerConfig.maxDate) {\n $scope.maxDate = bbDatepickerConfig.maxDate;\n }\n\n if (!$scope.minDate && bbDatepickerConfig.minDate) {\n $scope.minDate = bbDatepickerConfig.minDate;\n }\n\n $scope.resources = bbResources;\n\n if (angular.isDefined(attr.showButtonBar)) {\n $scope.locals.showButtonBar = attr.showButtonBar;\n }\n\n if (angular.isDefined(attr.closeOnDateSelection)) {\n $scope.locals.closeOnSelection = attr.closeOnDateSelection;\n }\n\n if (angular.isDefined(attr.datepickerAppendToBody)) {\n $scope.locals.appendToBody = (attr.datepickerAppendToBody === 'true');\n }\n\n if (angular.isUndefined($scope.format)) {\n $scope.format = bbDatepickerConfig.currentCultureDateFormatString;\n }\n\n if (angular.isDefined($scope.dateOptions)) {\n angular.extend($scope.locals.dateOptions, $scope.dateOptions);\n\n }\n\n if (angular.isDefined($scope.customValidation)) {\n if (angular.isFunction($scope.customValidation.formatValue)) {\n $scope.locals.hasCustomValidation = true;\n }\n }\n\n $scope.locals.required = angular.isDefined(attr.required);\n\n\n if ($scope.placeholderText === null || angular.isUndefined($scope.placeholderText)) {\n $scope.placeholderText = $scope.format.toLowerCase();\n }\n\n setDate();\n\n $scope.$watch('date', function (newValue, oldValue) {\n if (newValue !== oldValue && !dateChangeInternal) {\n setDate();\n } else if (dateChangeInternal) {\n dateChangeInternal = false;\n }\n });\n\n $scope.$watch('locals.date', function () {\n\n if ($scope.date !== $scope.locals.date) {\n if (angular.isDate($scope.locals.date)) {\n dateChangeInternal = true;\n $scope.date = $scope.locals.date;\n }\n }\n\n });\n\n function runValidators() {\n var inputNgModel = $scope.getInputNgModel();\n /*istanbul ignore else: sanity check */\n if (inputNgModel) {\n inputNgModel.$validate();\n }\n }\n\n $scope.$watch('maxDate', function () {\n runValidators();\n });\n\n $scope.$watch('minDate', function () {\n runValidators();\n });\n\n function hasRequiredError() {\n var inputNgModel = $scope.getInputNgModel();\n\n return inputNgModel && inputNgModel.$error && inputNgModel.$error.required;\n }\n\n function hasMinMaxError() {\n var inputNgModel = $scope.getInputNgModel();\n\n return inputNgModel && inputNgModel.$error && (inputNgModel.$error.minDate || inputNgModel.$error.maxDate);\n }\n\n\n function dateFormatValidator() {\n var customFormattingResult,\n deferred,\n inputNgModel;\n\n function resolveValidation() {\n var inputNgModel = $scope.getInputNgModel();\n\n if (inputNgModel !== null) {\n deferred[inputNgModel.invalidFormatMessage ? 'reject' : 'resolve']();\n inputNgModel.$setValidity('dateFormat', !inputNgModel.invalidFormatMessage || inputNgModel.invalidFormatMessage === '');\n } else {\n deferred.resolve();\n }\n }\n\n function setInvalidFormatMessage(errorMessage) {\n var inputNgModel = $scope.getInputNgModel();\n\n if (inputNgModel !== null) {\n inputNgModel.invalidFormatMessage = errorMessage;\n }\n }\n\n function handleCustomFormattingValidation(result) {\n result = result || {};\n\n setInvalidFormatMessage(result.formattingErrorMessage);\n resolveValidation();\n\n if (result.formattedValue !== $scope.date) {\n skipValidation = true;\n dateChangeInternal = true;\n $scope.date = result.formattedValue;\n $scope.locals.date = result.formattedValue;\n }\n\n }\n\n function datepickerIsPristine() {\n var inputNgModel = $scope.getInputNgModel();\n\n if (inputNgModel !== null) {\n return inputNgModel.$pristine;\n } else {\n return true;\n }\n }\n\n deferred = $q.defer();\n\n if (skipValidation || angular.isDate($scope.locals.date) || $scope.locals.date === '' || ($scope.locals.required && hasRequiredError()) || hasMinMaxError() || (!$scope.locals.required && $scope.locals.date === null) || datepickerIsPristine()) {\n setInvalidFormatMessage(null);\n resolveValidation();\n } else if ($scope.locals.hasCustomValidation && angular.isString($scope.locals.date)) {\n customFormattingResult = $scope.customValidation.formatValue($scope.locals.date);\n if (customFormattingResult.then) {\n customFormattingResult.then(handleCustomFormattingValidation);\n } else {\n handleCustomFormattingValidation(customFormattingResult);\n return deferred.promise;\n }\n } else {\n inputNgModel = $scope.getInputNgModel();\n /* istanbul ignore else: sanity check */\n if (inputNgModel !== null && inputNgModel.$error && inputNgModel.$error.date) {\n setInvalidFormatMessage(bbResources.date_field_invalid_date_message);\n }\n resolveValidation();\n }\n\n skipValidation = false;\n return deferred.promise;\n }\n\n ngModel.$asyncValidators.dateFormat = dateFormatValidator;\n\n $scope.locals.loaded = true;\n\n function inputChange() {\n var inputNgModel;\n\n //allows validation to kick off for invalid dates\n if (angular.isUndefined($scope.locals.date) && angular.isDefined(inputEl.val()) && inputEl.val() !== '') {\n dateChangeInternal = true;\n $scope.date = inputEl.val();\n } else if ($scope.locals.required && hasRequiredError()) {\n dateChangeInternal = true;\n $scope.date = '';\n inputNgModel = $scope.getInputNgModel();\n inputNgModel.invalidFormatMessage = null;\n inputNgModel.$setValidity('dateFormat', true);\n } else if ($scope.date !== $scope.locals.date) {\n dateChangeInternal = true;\n $scope.date = $scope.locals.date;\n }\n }\n\n function enterPress($event) {\n if ($event.keyCode === 13) {\n inputChange();\n }\n }\n\n $scope.locals.enterPress = enterPress;\n\n //Timeout allows the locals.loaded to be applied to dom and ng-if=true to go into effect.\n $timeout(function () {\n inputEl = el.find('input');\n inputEl.on('change blur', function () {\n $timeout(function () {\n inputChange();\n });\n });\n\n });\n\n }\n };\n }])\n .directive('bbDatepickerCustomValidate', ['$filter', 'bbDatepickerParser', function ($filter, bbDatepickerParser) {\n return {\n restrict: 'A',\n require: ['ngModel', '^bbDatepicker'],\n link: function ($scope, el, attr, controllers) {\n var ngModel = controllers[0],\n format = attr.uibDatepickerPopup,\n oldDateSelection,\n uibPopupScope;\n\n if (attr.bbDatepickerCustomValidate && attr.bbDatepickerCustomValidate === 'true') {\n ngModel.$parsers = [];\n ngModel.$validators.date = function () {\n return true;\n };\n\n uibPopupScope = el.isolateScope();\n\n /* When using custom validation, removing the validators\n and parsers means that changing the date in the calendar\n does not kick off the custom validation, so we must\n trigger it manually */\n oldDateSelection = uibPopupScope.dateSelection;\n uibPopupScope.dateSelection = function (newDate) {\n oldDateSelection(newDate);\n el.trigger('change');\n };\n\n } else {\n ngModel.$parsers.unshift(function (viewValue) {\n var newDate = ngModel.$viewValue,\n date = null;\n //date was changed from datepicker or is empty so just return\n if (typeof newDate === 'object' || newDate === '') {\n return newDate;\n }\n\n date = bbDatepickerParser.runParsers(newDate, format);\n\n if (angular.isDate(date)) {\n el.val($filter('date')(date, format));\n }\n\n return date ? date : viewValue;\n });\n }\n\n controllers[1].getInputNgModel = function () {\n return ngModel;\n };\n }\n };\n }])\n .directive('bbMinDate', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function ($scope, element, attrs, ngModel) {\n ngModel.$validators.minDate = function (modelValue) {\n return !$scope.minDate || !modelValue || !angular.isDate(modelValue) || !angular.isDate($scope.minDate) || modelValue >= $scope.minDate;\n };\n }\n };\n })\n .directive('bbMaxDate', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function ($scope, element, attrs, ngModel) {\n ngModel.$validators.maxDate = function (modelValue) {\n return !$scope.maxDate || !modelValue || !angular.isDate(modelValue) || !angular.isDate($scope.maxDate) || modelValue <= $scope.maxDate;\n };\n }\n };\n })\n .factory('bbDatepickerParser', ['bbMoment', function (bbMoment) {\n\n function parseUTCString(value) {\n var date = null,\n dateArray,\n datePart;\n\n if (angular.isString(value) && value.indexOf('T00:00:00') !== -1) {\n datePart = value.split('T')[0];\n\n dateArray = datePart.split('-');\n date = new Date(dateArray[0], dateArray[1] - 1, dateArray[2]);\n }\n return date;\n }\n\n function parseNoSeparatorDateString(value, format) {\n var date = null,\n yearBegin = format.indexOf('y'),\n monthBegin = format.indexOf('M'),\n dayBegin = format.indexOf('d'),\n yearIndex,\n monthIndex,\n dayIndex;\n if (angular.isString(value) && value.length === 8 && !isNaN(value)) {\n if ((dayBegin < yearBegin) && (monthBegin < yearBegin)) {\n yearIndex = 4;\n if (monthBegin < dayBegin) {\n dayIndex = 2;\n monthIndex = 0;\n } else {\n dayIndex = 0;\n monthIndex = 2;\n }\n } else if ((yearBegin < monthBegin) && (monthBegin < dayBegin)) {\n yearIndex = 0;\n monthIndex = 4;\n dayIndex = 6;\n } else {\n return null;\n }\n\n date = new Date(value.substr(yearIndex, 4), (value.substr(monthIndex, 2) - 1), value.substr(dayIndex, 2));\n }\n return date;\n }\n\n function matchSeparator(value) {\n return value.match(/[.\\/\\-\\s].*?/);\n }\n\n function dateHasSeparator(value) {\n /*\n * Validation criteria:\n * A separator exists\n * There is no separator at the beginning\n * There is no separator at the end\n * Two separators exist\n * All parts of the date have a non-zero value\n */\n\n var separator = matchSeparator(value),\n valueArray = value.split(separator),\n separatorAtEnd = value.indexOf(separator, value.length - 1) !== -1,\n separatorAtBeginning = value.indexOf(separator) === 0,\n hasTwoSeparators = valueArray.length - 1 === 2,\n anyPartIsZero = valueArray.some(function (e) {\n return Number(e) === 0;\n });\n\n return (separator && !separatorAtEnd && !separatorAtBeginning && hasTwoSeparators && !anyPartIsZero);\n }\n\n function isMomentParsable(value, format) {\n var yearParts,\n yearIndex,\n monthIndex,\n dayIndex,\n separator;\n\n if (angular.isString(value) && dateHasSeparator(value)) {\n\n if (value.length === 10) {\n return true;\n } else if (value.length === 9 || value.length === 8) {\n //insure that years have 4 characters\n separator = matchSeparator(value);\n yearParts = value.split(separator);\n yearIndex = format.indexOf('y');\n monthIndex = format.indexOf('M');\n dayIndex = format.indexOf('d');\n if (yearIndex > monthIndex && yearIndex > dayIndex) {\n return yearParts[2].length === 4;\n }\n\n if (yearIndex < monthIndex && yearIndex < dayIndex) {\n return yearParts[0].length === 4;\n }\n\n }\n\n }\n\n return false;\n }\n\n\n\n function parseMoment(value, format) {\n var date = null,\n momentDate;\n\n if (isMomentParsable(value, format)) {\n momentDate = bbMoment(value, format.toUpperCase());\n if (momentDate.isValid()) {\n date = momentDate.toDate();\n }\n }\n\n return date;\n }\n\n return {\n parseUTCString: parseUTCString,\n parseNoSeparatorDateString: parseNoSeparatorDateString,\n parseMoment: parseMoment,\n runParsers: function (value, format) {\n var date = null;\n\n if (!value || angular.isDate(value) || value === '') {\n return value;\n }\n\n date = parseUTCString(value);\n\n if (angular.isDate(date)) {\n return date;\n }\n\n date = parseNoSeparatorDateString(value, format);\n\n if (angular.isDate(date)) {\n return date;\n }\n\n date = parseMoment(value, format);\n\n return date;\n\n }\n };\n }]);\n\n\n}(jQuery));\n", "/*jshint browser: true */\n/*global angular */\n\n(function () {\n 'use strict';\n\n\n function bbDateRangePickerFactory(bbResources) {\n var dateRangeTypes,\n defaultDateRangeOptions,\n specificDateRangeOptions,\n pastDateRangeOptions,\n dateRangeMap;\n\n dateRangeTypes = {\n AT_ANY_TIME: 0,\n NEXT_WEEK: 1,\n THIS_MONTH: 2,\n NEXT_MONTH: 3,\n THIS_QUARTER: 4,\n NEXT_QUARTER: 5,\n THIS_FISCAL_YEAR: 6,\n NEXT_FISCAL_YEAR: 7,\n THIS_CALENDAR_YEAR: 8,\n NEXT_CALENDAR_YEAR: 9,\n LAST_WEEK: 10,\n LAST_MONTH: 11,\n LAST_QUARTER: 12,\n LAST_FISCAL_YEAR: 13,\n LAST_CALENDAR_YEAR: 14,\n TODAY: 15,\n YESTERDAY: 16,\n TOMORROW: 17,\n THIS_WEEK: 18,\n SPECIFIC_RANGE: 19\n };\n\n\n // Deprecated\n defaultDateRangeOptions = [\n dateRangeTypes.AT_ANY_TIME,\n dateRangeTypes.YESTERDAY,\n dateRangeTypes.TODAY,\n dateRangeTypes.TOMORROW,\n dateRangeTypes.LAST_WEEK,\n dateRangeTypes.THIS_WEEK,\n dateRangeTypes.NEXT_WEEK,\n dateRangeTypes.LAST_MONTH,\n dateRangeTypes.THIS_MONTH,\n dateRangeTypes.NEXT_MONTH,\n dateRangeTypes.LAST_QUARTER,\n dateRangeTypes.THIS_QUARTER,\n dateRangeTypes.NEXT_QUARTER,\n dateRangeTypes.LAST_CALENDAR_YEAR,\n dateRangeTypes.THIS_CALENDAR_YEAR,\n dateRangeTypes.NEXT_CALENDAR_YEAR,\n dateRangeTypes.LAST_FISCAL_YEAR,\n dateRangeTypes.THIS_FISCAL_YEAR,\n dateRangeTypes.NEXT_FISCAL_YEAR\n ];\n\n // Deprecated\n specificDateRangeOptions = defaultDateRangeOptions.concat([dateRangeTypes.SPECIFIC_RANGE]);\n\n // Deprecated\n pastDateRangeOptions = [\n dateRangeTypes.AT_ANY_TIME,\n dateRangeTypes.YESTERDAY,\n dateRangeTypes.TODAY,\n dateRangeTypes.LAST_WEEK,\n dateRangeTypes.THIS_WEEK,\n dateRangeTypes.LAST_MONTH,\n dateRangeTypes.THIS_MONTH,\n dateRangeTypes.LAST_QUARTER,\n dateRangeTypes.THIS_QUARTER,\n dateRangeTypes.LAST_CALENDAR_YEAR,\n dateRangeTypes.THIS_CALENDAR_YEAR,\n dateRangeTypes.LAST_FISCAL_YEAR,\n dateRangeTypes.THIS_FISCAL_YEAR\n ];\n\n dateRangeMap = {};\n dateRangeMap[dateRangeTypes.AT_ANY_TIME] = {\n caption: bbResources.date_range_picker_at_any_time,\n description: bbResources.date_range_picker_filter_description_at_any_time\n };\n dateRangeMap[dateRangeTypes.YESTERDAY] = {\n caption: bbResources.date_range_picker_yesterday,\n description: bbResources.date_range_picker_filter_description_yesterday\n };\n dateRangeMap[dateRangeTypes.TODAY] = {\n caption: bbResources.date_range_picker_today,\n description: bbResources.date_range_picker_filter_description_today\n };\n dateRangeMap[dateRangeTypes.TOMORROW] = {\n caption: bbResources.date_range_picker_tomorrow,\n description: bbResources.date_range_picker_filter_description_tomorrow\n };\n dateRangeMap[dateRangeTypes.LAST_WEEK] = {\n caption: bbResources.date_range_picker_last_week,\n description: bbResources.date_range_picker_filter_description_last_week\n };\n dateRangeMap[dateRangeTypes.THIS_WEEK] = {\n caption: bbResources.date_range_picker_this_week,\n description: bbResources.date_range_picker_filter_description_this_week\n };\n dateRangeMap[dateRangeTypes.NEXT_WEEK] = {\n caption: bbResources.date_range_picker_next_week,\n description: bbResources.date_range_picker_filter_description_next_week\n };\n dateRangeMap[dateRangeTypes.LAST_QUARTER] = {\n caption: bbResources.date_range_picker_last_quarter,\n description: bbResources.date_range_picker_filter_description_last_quarter\n };\n dateRangeMap[dateRangeTypes.THIS_QUARTER] = {\n caption: bbResources.date_range_picker_this_quarter,\n description: bbResources.date_range_picker_filter_description_this_quarter\n };\n dateRangeMap[dateRangeTypes.NEXT_QUARTER] = {\n caption: bbResources.date_range_picker_next_quarter,\n description: bbResources.date_range_picker_filter_description_next_quarter\n };\n dateRangeMap[dateRangeTypes.LAST_CALENDAR_YEAR] = {\n caption: bbResources.date_range_picker_last_calendar_year,\n description: bbResources.date_range_picker_filter_description_last_calendar_year\n };\n dateRangeMap[dateRangeTypes.THIS_CALENDAR_YEAR] = {\n caption: bbResources.date_range_picker_this_calendar_year,\n description: bbResources.date_range_picker_filter_description_this_calendar_year\n };\n dateRangeMap[dateRangeTypes.NEXT_CALENDAR_YEAR] = {\n caption: bbResources.date_range_picker_next_calendar_year,\n description: bbResources.date_range_picker_filter_description_next_calendar_year\n };\n dateRangeMap[dateRangeTypes.LAST_FISCAL_YEAR] = {\n caption: bbResources.date_range_picker_last_fiscal_year,\n description: bbResources.date_range_picker_filter_description_last_fiscal_year\n };\n dateRangeMap[dateRangeTypes.THIS_FISCAL_YEAR] = {\n caption: bbResources.date_range_picker_this_fiscal_year,\n description: bbResources.date_range_picker_filter_description_this_fiscal_year\n };\n dateRangeMap[dateRangeTypes.NEXT_FISCAL_YEAR] = {\n caption: bbResources.date_range_picker_next_fiscal_year,\n description: bbResources.date_range_picker_filter_description_next_fiscal_year\n };\n dateRangeMap[dateRangeTypes.THIS_MONTH] = {\n caption: bbResources.date_range_picker_this_month,\n description: bbResources.date_range_picker_filter_description_this_month\n };\n dateRangeMap[dateRangeTypes.NEXT_MONTH] = {\n caption: bbResources.date_range_picker_next_month,\n description: bbResources.date_range_picker_filter_description_next_month\n };\n dateRangeMap[dateRangeTypes.LAST_MONTH] = {\n caption: bbResources.date_range_picker_last_month,\n description: bbResources.date_range_picker_filter_description_last_month\n };\n dateRangeMap[dateRangeTypes.SPECIFIC_RANGE] = {\n caption: bbResources.date_range_picker_specific_range,\n description: bbResources.date_range_picker_filter_description_specific_range\n };\n\n function getTypeInfoFromDateRangePickerValue(dateRangePickerValue, getDateRangeTypeInfo) {\n var info;\n if (dateRangePickerValue && dateRangePickerValue.dateRangeType) {\n info = getDateRangeTypeInfo(dateRangePickerValue.dateRangeType);\n } else {\n info = getDateRangeTypeInfo(dateRangePickerValue);\n }\n return info;\n }\n\n\n function getDateRangeTypeCaption(dateRangePickerValue, getDateRangeTypeInfo) {\n var info;\n\n if (angular.isFunction(getDateRangeTypeInfo)) {\n\n info = getTypeInfoFromDateRangePickerValue(dateRangePickerValue, getDateRangeTypeInfo);\n\n if (info && info.caption) {\n return info.caption;\n }\n }\n\n if (angular.isNumber(dateRangePickerValue)) {\n // If the input is the enum value itself, then map it to the object structure we expect before proceeding.\n dateRangePickerValue = { dateRangeType: dateRangePickerValue };\n } else {\n // If the value is undefiend, then map it to a null object.\n dateRangePickerValue = dateRangePickerValue || {};\n }\n\n if (!angular.isDefined(dateRangePickerValue.dateRangeType)) {\n // If the enum value is undefined, then it represents any time.\n dateRangePickerValue.dateRangeType = dateRangeTypes.AT_ANY_TIME;\n }\n\n if (angular.isDefined(dateRangeMap[dateRangePickerValue.dateRangeType])) {\n return dateRangeMap[dateRangePickerValue.dateRangeType].caption;\n } else {\n return '';\n }\n\n }\n\n function getDateRangeFilterDescription(dateRangePickerValue, getDateRangeTypeInfo) {\n var info;\n if (angular.isFunction(getDateRangeTypeInfo)) {\n info = getTypeInfoFromDateRangePickerValue(dateRangePickerValue, getDateRangeTypeInfo);\n if (info && info.description) {\n return info.description;\n }\n }\n\n if (angular.isNumber(dateRangePickerValue)) {\n // If the input is the enum value itself, then map it to the object structure we expect before proceeding.\n dateRangePickerValue = { dateRangeType: dateRangePickerValue };\n } else {\n // If the value is undefiend, then map it to a null object.\n dateRangePickerValue = dateRangePickerValue || {};\n }\n\n if (!angular.isDefined(dateRangePickerValue.dateRangeType)) {\n // If the enum value is undefined, then it represents any time.\n dateRangePickerValue.dateRangeType = dateRangeTypes.AT_ANY_TIME;\n }\n if (angular.isDefined(dateRangeMap[dateRangePickerValue.dateRangeType])) {\n return dateRangeMap[dateRangePickerValue.dateRangeType].description;\n } else {\n return '';\n }\n }\n\n function getDateRangeOptions(optionTypes) {\n var dateRangeOptions = [dateRangeTypes.AT_ANY_TIME];\n optionTypes = optionTypes || {};\n\n if (optionTypes.includeDefault) {\n dateRangeOptions.push(dateRangeTypes.YESTERDAY);\n dateRangeOptions.push(dateRangeTypes.TODAY);\n dateRangeOptions.push(dateRangeTypes.TOMORROW);\n dateRangeOptions.push(dateRangeTypes.LAST_WEEK);\n dateRangeOptions.push(dateRangeTypes.THIS_WEEK);\n dateRangeOptions.push(dateRangeTypes.NEXT_WEEK);\n dateRangeOptions.push(dateRangeTypes.LAST_MONTH);\n dateRangeOptions.push(dateRangeTypes.THIS_MONTH);\n dateRangeOptions.push(dateRangeTypes.NEXT_MONTH);\n dateRangeOptions.push(dateRangeTypes.LAST_QUARTER);\n dateRangeOptions.push(dateRangeTypes.THIS_QUARTER);\n dateRangeOptions.push(dateRangeTypes.NEXT_QUARTER);\n dateRangeOptions.push(dateRangeTypes.LAST_CALENDAR_YEAR);\n dateRangeOptions.push(dateRangeTypes.THIS_CALENDAR_YEAR);\n dateRangeOptions.push(dateRangeTypes.NEXT_CALENDAR_YEAR);\n dateRangeOptions.push(dateRangeTypes.LAST_FISCAL_YEAR);\n dateRangeOptions.push(dateRangeTypes.THIS_FISCAL_YEAR);\n dateRangeOptions.push(dateRangeTypes.NEXT_FISCAL_YEAR);\n }\n\n if (optionTypes.includePast && !optionTypes.includeDefault) {\n dateRangeOptions.push(dateRangeTypes.YESTERDAY);\n dateRangeOptions.push(dateRangeTypes.TODAY);\n dateRangeOptions.push(dateRangeTypes.LAST_WEEK);\n dateRangeOptions.push(dateRangeTypes.THIS_WEEK);\n dateRangeOptions.push(dateRangeTypes.LAST_MONTH);\n dateRangeOptions.push(dateRangeTypes.THIS_MONTH);\n dateRangeOptions.push(dateRangeTypes.LAST_QUARTER);\n dateRangeOptions.push(dateRangeTypes.THIS_QUARTER);\n dateRangeOptions.push(dateRangeTypes.LAST_CALENDAR_YEAR);\n dateRangeOptions.push(dateRangeTypes.THIS_CALENDAR_YEAR);\n dateRangeOptions.push(dateRangeTypes.LAST_FISCAL_YEAR);\n dateRangeOptions.push(dateRangeTypes.THIS_FISCAL_YEAR);\n }\n\n if (optionTypes.includeSpecific) {\n dateRangeOptions.push(dateRangeTypes.SPECIFIC_RANGE);\n }\n\n return dateRangeOptions;\n }\n\n return {\n \n defaultDateRangeOptions: defaultDateRangeOptions,\n pastDateRangeOptions: pastDateRangeOptions,\n specificDateRangeOptions: specificDateRangeOptions,\n\n dateRangeTypes: dateRangeTypes,\n getDateRangeOptions: getDateRangeOptions,\n getDateRangeTypeCaption: getDateRangeTypeCaption,\n getDateRangeFilterDescription: getDateRangeFilterDescription\n };\n }\n\n bbDateRangePickerFactory.$inject = ['bbResources'];\n\n function bbDateRangePickerDirective(bbDateRangePicker, bbResources) {\n\n return {\n replace: true,\n restrict: 'E',\n templateUrl: 'sky/templates/daterangepicker/daterangepicker.html',\n scope: {},\n controllerAs: 'bbDateRangePickerCtrl',\n bindToController: {\n bbDateRangePickerValue: \"=\",\n bbDateRangePickerAutomationId: \"=\",\n bbDateRangePickerOptions: '=',\n fromDate: '=?bbDateRangePickerFromDate',\n toDate: '=?bbDateRangePickerToDate',\n pickerLabel: '=?bbDateRangePickerLabel',\n isValid: '=?bbDateRangePickerValid'\n },\n controller: ['$scope', function ($scope) {\n var vm = this;\n vm.resources = bbResources;\n\n vm.defaultDateRangeOptions = bbDateRangePicker.getDateRangeOptions({includeDefault: true});\n\n vm.getDateRangeTypeCaption = function (dateRangeTypeValue) {\n var infoFunction;\n if (vm.bbDateRangePickerOptions && angular.isFunction(vm.bbDateRangePickerOptions.getDateRangeTypeInfo)) {\n infoFunction = vm.bbDateRangePickerOptions.getDateRangeTypeInfo;\n }\n return bbDateRangePicker.getDateRangeTypeCaption(dateRangeTypeValue, infoFunction);\n };\n\n $scope.$watch(\n function () {\n return vm.dateRangeForm.$valid;\n }, function (newVal) {\n vm.isValid = newVal;\n }\n );\n\n $scope.$watch(\n function () {\n return vm.fromDate;\n }, function (newVal) {\n /* This prevents minDate from having a reference\n to fromDate and changing it */\n vm.minDate = angular.copy(newVal);\n }\n );\n\n $scope.$watch(\n function () {\n return vm.toDate;\n }, function (newVal) {\n /* This prevents maxDate from having a reference\n to toDate and changing it */\n vm.maxDate = angular.copy(newVal);\n }\n );\n\n $scope.$watch(\n function () {\n return vm.bbDateRangePickerValue;\n }, function (newVal) {\n if (!newVal) {\n vm.bbDateRangePickerValue = {\n dateRangeType: bbDateRangePicker.dateRangeTypes.AT_ANY_TIME\n };\n return;\n }\n vm.specificRangeIsVisible = vm.bbDateRangePickerValue.dateRangeType === bbDateRangePicker.dateRangeTypes.SPECIFIC_RANGE;\n newVal.dateRangeType = newVal.dateRangeType || bbDateRangePicker.dateRangeTypes.AT_ANY_TIME;\n }, true);\n }],\n link: function ($scope, el, attr, vm) {\n vm.noLabels = attr.bbDateRangePickerNoLabels;\n if (vm.noLabels) {\n vm.toPlaceholder = bbResources.date_range_picker_to_date;\n vm.fromPlaceholder = bbResources.date_range_picker_from_date;\n } else {\n vm.toPlaceholder = '';\n vm.fromPlaceholder = '';\n }\n }\n };\n }\n\n bbDateRangePickerDirective.$inject = ['bbDateRangePicker', 'bbResources'];\n\n angular.module('sky.daterangepicker', ['sky.resources', 'sky.datepicker'])\n .factory('bbDateRangePicker', bbDateRangePickerFactory)\n .directive('bbDateRangePicker', bbDateRangePickerDirective);\n}());\n", "/* global angular */\n(function () {\n 'use strict';\n\n function BBErrorActionController($scope) {\n var vm = this;\n\n $scope.$on('$destroy', function () {\n vm.onDestroy();\n vm = null;\n });\n }\n\n BBErrorActionController.$inject = ['$scope'];\n\n function bbErrorAction() {\n function link(scope, el, attrs, ctrls) {\n var vm = ctrls[0],\n bbError = ctrls[1];\n\n vm.el = el;\n\n if (bbError !== null) {\n bbError.setAction(vm);\n }\n\n }\n\n return {\n restrict: 'E',\n require: ['bbErrorAction', '?^bbError'],\n controller: BBErrorActionController,\n controllerAs: 'bbErrorAction',\n link: link,\n scope: {}\n };\n }\n\n angular.module('sky.error.action.directive', [])\n .directive('bbErrorAction', bbErrorAction);\n}());\n", "/* global angular */\n(function () {\n 'use strict';\n\n function BBErrorDescriptionController($scope, bbResources) {\n var vm = this;\n\n $scope.$on('$destroy', function () {\n vm.onDestroy();\n vm = null;\n });\n\n $scope.$watch(function () {\n return vm.bbErrorType || vm.errorType;\n }, function (newValue) {\n switch (newValue) {\n case 'broken':\n vm.description = bbResources.error_description_broken;\n break;\n case 'construction':\n vm.description = bbResources.error_description_construction;\n break;\n case 'notFound':\n vm.description = '';\n }\n });\n }\n\n BBErrorDescriptionController.$inject = ['$scope', 'bbResources'];\n\n function bbErrorDescription() {\n function link(scope, el, attrs, ctrls) {\n var vm = ctrls[0],\n bbError = ctrls[1];\n\n vm.el = el;\n\n if (bbError !== null) {\n bbError.setDescription(vm, 'errorDefault' in attrs);\n }\n\n }\n\n return {\n restrict: 'E',\n require: ['bbErrorDescription', '?^bbError'],\n controller: BBErrorDescriptionController,\n controllerAs: 'bbErrorDescription',\n bindToController: {\n errorType: '@',\n bbErrorType: '@'\n },\n link: link,\n scope: {},\n transclude: true,\n templateUrl: 'sky/templates/error/error.description.directive.html'\n };\n }\n\n angular.module('sky.error.description.directive', [])\n .directive('bbErrorDescription', bbErrorDescription);\n}());\n", "/*global angular */\n(function () {\n 'use strict';\n\n var components = [{\n name: 'Image',\n cls: 'image'\n }, {\n name: 'Title',\n cls: 'title'\n }, {\n name: 'Description',\n cls: 'description'\n }, {\n name: 'Action',\n cls: 'action'\n }];\n\n\n function getCtrlPropName(component) {\n var name = component.name;\n\n return name.charAt(0).toLowerCase() + name.substr(1) + 'Ctrl';\n }\n\n function getOverridePropName(component) {\n var name = component.name;\n\n return name.charAt(0).toLowerCase() + name.substr(1) + 'HasOverride';\n }\n\n function BBErrorController($scope) {\n var vm = this;\n\n function addComponentSetter(component) {\n var name = component.name;\n\n vm['set' + name] = function (ctrl, isDefaultError) {\n var ctrlName = getCtrlPropName(component),\n hasOverride = getOverridePropName(component);\n\n vm[ctrlName] = ctrl;\n\n if (!isDefaultError) {\n vm[hasOverride] = true;\n }\n\n ctrl.onDestroy = function () {\n vm[ctrlName] = null;\n };\n };\n }\n\n $scope.$watch(function () {\n return vm.bbErrorType || vm.errorType;\n }, function (newValue) {\n vm.imageType = newValue;\n vm.titleType = newValue;\n vm.descriptionType = newValue;\n });\n\n components.forEach(addComponentSetter);\n }\n\n BBErrorController.$inject = ['$scope'];\n\n function bbError() {\n function link(scope, el, attrs, vm) {\n function watchForComponent(component) {\n scope.$watch(function () {\n return vm[getCtrlPropName(component)];\n }, function (newValue) {\n\n if (newValue) {\n\n el.find('.bb-error-' + component.cls)\n .empty()\n .append(newValue.el);\n }\n });\n }\n\n components.forEach(watchForComponent);\n }\n\n return {\n restrict: 'E',\n controller: 'BBErrorController',\n controllerAs: 'bbError',\n bindToController: {\n errorType: '@',\n bbErrorType: '@'\n },\n link: link,\n scope: {},\n templateUrl: 'sky/templates/error/error.directive.html',\n transclude: true\n };\n }\n\n angular.module('sky.error.directive', ['sky.error.image.directive', 'sky.error.title.directive', 'sky.error.description.directive', 'sky.error.action.directive'])\n .controller('BBErrorController', BBErrorController)\n .directive('bbError', bbError);\n\n}());\n", "/* global angular */\n(function () {\n 'use strict';\n\n function BBErrorImageController($scope) {\n var vm = this;\n\n $scope.$on('$destroy', function () {\n vm.onDestroy();\n vm = null;\n });\n\n\n }\n\n BBErrorImageController.$inject = ['$scope'];\n\n function bbErrorImage() {\n function link(scope, el, attrs, ctrls) {\n var vm = ctrls[0],\n bbError = ctrls[1];\n\n vm.el = el;\n\n if (bbError !== null) {\n bbError.setImage(vm, 'errorDefault' in attrs);\n }\n\n if (angular.isDefined(attrs.errorType)) {\n scope.$watch(function () {\n return vm.errorType;\n }, function (newValue) {\n if (newValue !== vm.bbErrorType) {\n vm.bbErrorType = newValue;\n }\n });\n }\n }\n\n return {\n restrict: 'E',\n require: ['bbErrorImage', '?^bbError'],\n controller: BBErrorImageController,\n controllerAs: 'bbErrorImage',\n bindToController: {\n errorType: '@',\n bbErrorType: '@'\n },\n link: link,\n scope: {},\n transclude: true,\n templateUrl: 'sky/templates/error/error.image.directive.html'\n };\n }\n\n angular.module('sky.error.image.directive', [])\n .directive('bbErrorImage', bbErrorImage);\n}());\n", "/* global angular */\n(function () {\n 'use strict';\n\n function BBErrorTitleController($scope, bbResources) {\n var vm = this;\n\n $scope.$on('$destroy', function () {\n vm.onDestroy();\n vm = null;\n });\n\n $scope.$watch(function () {\n return vm.bbErrorType || vm.errorType;\n }, function (newValue) {\n switch (newValue) {\n case 'broken':\n vm.title = bbResources.error_title_broken;\n break;\n case 'construction':\n vm.title = bbResources.error_title_construction;\n break;\n case 'notFound':\n vm.title = bbResources.error_title_notfound;\n break;\n }\n });\n\n }\n\n BBErrorTitleController.$inject = ['$scope', 'bbResources'];\n\n function bbErrorTitle() {\n function link(scope, el, attrs, ctrls) {\n var vm = ctrls[0],\n bbError = ctrls[1];\n\n vm.el = el;\n\n if (bbError !== null) {\n bbError.setTitle(vm, 'errorDefault' in attrs);\n }\n\n }\n\n return {\n restrict: 'E',\n require: ['bbErrorTitle', '?^bbError'],\n controller: BBErrorTitleController,\n controllerAs: 'bbErrorTitle',\n bindToController: {\n errorType: '@',\n bbErrorType: '@'\n },\n link: link,\n scope: {},\n transclude: true,\n templateUrl: 'sky/templates/error/error.title.directive.html'\n };\n }\n\n angular.module('sky.error.title.directive', [])\n .directive('bbErrorTitle', bbErrorTitle);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function BBErrorModalController($uibModalInstance, options) {\n var vm = this;\n\n vm.options = options;\n\n vm.close = function () {\n $uibModalInstance.close();\n };\n }\n\n BBErrorModalController.$inject = ['$uibModalInstance', 'options'];\n\n angular.module('sky.errormodal.controller', ['sky.error.directive'])\n .controller('BBErrorModalController', BBErrorModalController);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbErrorModal(bbModal) {\n return {\n open: function (options) {\n return bbModal.open({\n controller: 'BBErrorModalController as bbErrorModal',\n templateUrl: 'sky/templates/error/errormodal.template.html',\n resolve: {\n options: function () {\n return options;\n }\n }\n });\n }\n };\n }\n\n bbErrorModal.$inject = ['bbModal'];\n\n angular.module('sky.errormodal.service', ['sky.errormodal.controller', 'sky.modal'])\n .factory('bbErrorModal', bbErrorModal);\n}());\n", "/*jshint browser: true */\n/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module(\n 'sky.fileattachments',\n [\n 'sky.fileattachments.filedrop',\n 'sky.fileattachments.fileitem',\n 'sky.fileattachments.filesize'\n ]\n );\n}());\n", "/*global angular, jQuery */\n\n(function ($) {\n 'use strict';\n\n function run($window) {\n $($window).on('dragover drop', function (e) {\n if (!$(e.target).hasClass('bb-file-drop-target')) {\n e.preventDefault();\n }\n });\n }\n\n run.$inject = ['$window'];\n\n function bbFileDrop($parse, $templateCache) {\n return {\n link: function (scope, el, attrs) {\n scope.bbFileDrop = {\n hasTranscludeContents: $.trim(el.find('.bb-file-drop-contents-custom').html()).length > 0,\n allowLinks: angular.isDefined(attrs.bbFileDropLink),\n addLink: function ($event) {\n $event.preventDefault();\n scope.bbFileDropLinkChange({\n link: {\n url: scope.bbFileDrop.url\n }\n });\n\n scope.bbFileDrop.url = null;\n },\n fileChange: function ($files, $event, $invalidFiles) {\n scope.bbFileDropChange({\n files: $files,\n rejectedFiles: $invalidFiles\n });\n }\n };\n },\n scope: {\n bbFileDropChange: '&',\n bbFileDropLinkChange: '&'\n },\n template: function (el, attrs) {\n var dropEl;\n\n el.html($templateCache.get('sky/templates/fileattachments/filedrop.html'));\n\n dropEl = el.find('.bb-file-drop');\n\n dropEl.attr({\n 'ngf-allow-dir': attrs.bbFileDropAllowDir,\n 'ngf-pattern': attrs.bbFileDropAccept,\n 'ngf-multiple': attrs.bbFileDropMultiple || 'true',\n 'ngf-min-size': attrs.bbFileDropMinSize || '0',\n 'ngf-max-size': attrs.bbFileDropMaxSize || '500000'\n });\n\n if (angular.isDefined(attrs.bbFileDropNoclick)) {\n dropEl.addClass('bb-file-drop-noclick');\n } else {\n dropEl.attr('ngf-select', '');\n }\n },\n transclude: true\n };\n }\n\n bbFileDrop.$inject = ['$parse', '$templateCache'];\n\n angular.module('sky.fileattachments.filedrop', ['ngFileUpload', 'sky.resources'])\n .run(run)\n .directive('bbFileDrop', bbFileDrop);\n}(jQuery));\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n function bbFileItem() {\n return {\n link: function (scope) {\n function getFileTypeUpper() {\n var fileType = '';\n\n if (scope.item) {\n fileType = scope.item.type || '';\n }\n\n return fileType.toUpperCase();\n }\n\n function getFileExtensionUpper() {\n var extension = '',\n name;\n\n if (scope.item) {\n name = scope.item.name || '';\n\n extension = name.substr(name.lastIndexOf('.')) || '';\n }\n\n return extension.toUpperCase();\n }\n\n scope.bbFileItem = {\n isFile: function () {\n var item = scope.item;\n\n return item && angular.isDefined(item.size);\n },\n isImg: function () {\n var fileTypeUpper = getFileTypeUpper(),\n slashIndex;\n\n slashIndex = fileTypeUpper.indexOf('/');\n\n if (slashIndex >= 0) {\n switch (fileTypeUpper.substr(fileTypeUpper.indexOf('/') + 1)) {\n case 'BMP':\n case 'GIF':\n case 'JPEG':\n case 'PNG':\n return true;\n }\n }\n\n return false;\n }\n };\n\n scope.$watch('item.type', function () {\n var cls,\n extensionUpper = getFileExtensionUpper(),\n fileTypeUpper;\n\n switch (extensionUpper) {\n case '.PDF':\n cls = 'pdf';\n break;\n case '.GZ':\n case '.RAR':\n case '.TGZ':\n case '.ZIP':\n cls = 'archive';\n break;\n case '.PPT':\n case '.PPTX':\n cls = 'powerpoint';\n break;\n case '.DOC':\n case '.DOCX':\n cls = 'word';\n break;\n case '.XLS':\n case '.XLSX':\n cls = 'excel';\n break;\n case '.TXT':\n cls = 'text';\n break;\n case '.HTM':\n case '.HTML':\n cls = 'code';\n break;\n }\n\n if (!cls) {\n fileTypeUpper = getFileTypeUpper();\n\n switch (fileTypeUpper.substr(0, fileTypeUpper.indexOf('/'))) {\n case 'AUDIO':\n cls = 'audio';\n break;\n case 'IMAGE':\n // Normally images are displayed as thumbnails, but if an image type is not recognized\n // as being widely supported by modern browsers (e.g. TIFF files) then an icon should\n // be displayed instead.\n cls = 'image';\n break;\n case 'TEXT':\n cls = 'text';\n break;\n case 'VIDEO':\n cls = 'video';\n break;\n }\n }\n\n scope.bbFileItem.otherCls = 'fa-file-' + (cls ? cls + '-' : '') + 'o';\n });\n },\n scope: {\n item: '=bbFileItem',\n itemDelete: '&bbFileItemDelete'\n },\n templateUrl: 'sky/templates/fileattachments/fileitem.html',\n transclude: true\n };\n }\n\n angular.module('sky.fileattachments.fileitem', ['ngFileUpload', 'sky.fileattachments.filesize', 'sky.resources'])\n .directive('bbFileItem', bbFileItem);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n \n function bbFileSize($filter, bbFormat, bbResources) {\n return function (input) {\n var decimalPlaces = 0,\n dividend = 1,\n formattedSize,\n roundedSize,\n template;\n \n if (input === null || angular.isUndefined(input)) {\n return '';\n }\n \n if (Math.abs(input) === 1) {\n template = bbResources.file_size_b_singular;\n } else if (input < 1000) {\n template = bbResources.file_size_b_plural;\n } else if (input < 1e6) {\n template = bbResources.file_size_kb;\n dividend = 1000;\n } else if (input < 1e9) {\n template = bbResources.file_size_mb;\n dividend = 1e6;\n decimalPlaces = 1;\n } else {\n template = bbResources.file_size_gb;\n dividend = 1e9;\n decimalPlaces = 1;\n }\n\n roundedSize = Math.floor(input / (dividend / Math.pow(10, decimalPlaces))) / Math.pow(10, decimalPlaces);\n\n formattedSize = $filter('number')(roundedSize);\n\n return bbFormat.formatText(template, formattedSize);\n };\n }\n \n bbFileSize.$inject = ['$filter', 'bbFormat', 'bbResources'];\n \n angular.module('sky.fileattachments.filesize', ['sky.format', 'sky.resources'])\n .filter('bbFileSize', bbFileSize);\n}());", "/*global angular */\n\n(function () {\n 'use strict';\n var tagsToReplace = {\n '&': '&',\n '<': '<',\n '>': '>'\n };\n\n function replaceTag(tag) {\n return tagsToReplace[tag];\n }\n\n function isEmpty(str) {\n return str === null || angular.isUndefined(str);\n }\n\n angular.module('sky.format', [])\n .factory('bbFormat', function () {\n return {\n formatText: function (format) {\n var args;\n\n if (isEmpty(format)) {\n return '';\n }\n\n args = arguments;\n\n return String(format).replace(/\\{(\\d+)\\}/g, function (match, capture) {\n /*jslint unparam: true */\n return args[parseInt(capture, 10) + 1];\n });\n },\n escape: function (str) {\n if (isEmpty(str)) {\n return '';\n }\n\n return String(str).replace(/[&<>]/g, replaceTag);\n }\n };\n });\n}());\n", "/*jslint browser: false, plusplus: true */\n/*global angular */\n\n(function () {\n 'use strict';\n\n function buildCategoryList(columns) {\n var categories = [],\n column,\n index,\n len;\n\n len = columns.length;\n\n for (index = 0; index < len; index++) {\n column = columns[index];\n\n if (column.category) {\n if (categories.indexOf(column.category) === -1) {\n categories.push(column.category);\n }\n }\n }\n\n return categories;\n }\n\n\n function columnCompare(a, b) {\n a = a.title.toLocaleLowerCase();\n b = b.title.toLocaleLowerCase();\n\n if (a < b) {\n return -1;\n }\n\n if (a > b) {\n return 1;\n }\n\n return 0;\n }\n\n function getInitialSelectedColumns(columns, selectedIds) {\n var selectedColumns = [];\n\n angular.forEach(columns, function (column) {\n if (selectedIds.indexOf(column.id) >= 0) {\n selectedColumns.push(column);\n }\n });\n\n return selectedColumns;\n }\n\n function BBGridColumnPickerController($scope, availableColumns, initialSelectedColumnIds, columnPickerHelpKey, subsetLabel, subsetProperty, subsetExclude, onlySelected) {\n var columns = [],\n initialSelectedColumns;\n\n angular.forEach(availableColumns, function (column) {\n var newColumn = {\n id: column.id,\n name: column.name,\n title: column.caption,\n category: column.category,\n description: column.description\n };\n\n if (subsetProperty) {\n newColumn[subsetProperty] = column[subsetProperty];\n }\n\n columns.push(newColumn);\n });\n\n initialSelectedColumns = getInitialSelectedColumns(columns, initialSelectedColumnIds);\n\n columns.sort(columnCompare);\n\n $scope.columns = columns;\n $scope.categories = buildCategoryList(columns);\n $scope.locals = {};\n $scope.locals.selectedColumns = initialSelectedColumns.slice(0);\n $scope.locals.subsetLabel = subsetLabel;\n $scope.locals.subsetProperty = subsetProperty;\n\n if (subsetExclude) {\n $scope.locals.subsetExclude = subsetExclude;\n }\n\n if (onlySelected) {\n $scope.locals.onlySelected = onlySelected;\n }\n\n $scope.columnPickerHelpKey = columnPickerHelpKey;\n\n $scope.applyChanges = function () {\n var column,\n scopeColumns = $scope.columns,\n selectedColumns = $scope.locals.selectedColumns,\n columnIds = [],\n i;\n\n //Loop through previously selected columns. If they are still selected, add\n //them to the resulting list in their original order.\n angular.forEach(initialSelectedColumnIds, function (columnId) {\n for (i = 0; i < scopeColumns.length; i++) {\n column = scopeColumns[i];\n\n if (column.id === columnId) {\n if (selectedColumns.indexOf(column) >= 0) {\n columnIds.push(column.id);\n }\n break;\n }\n }\n });\n\n //Loop through all columns. If they are selected and not already in the list\n //then add them to the end.\n angular.forEach(selectedColumns, function (column) {\n var id = column.id;\n\n if (columnIds.indexOf(id) < 0) {\n columnIds.push(id);\n }\n });\n\n $scope.$close(columnIds);\n };\n }\n\n BBGridColumnPickerController.$inject = ['$scope', 'columns', 'selectedColumnIds', 'columnPickerHelpKey', 'subsetLabel', 'subsetProperty', 'subsetExclude', 'onlySelected'];\n\n angular.module('sky.grids.columnpicker', ['sky.checklist', 'sky.resources'])\n .controller('BBGridColumnPickerController', BBGridColumnPickerController);\n}());\n", "/*global angular */\n\n(function () {\n 'use strict';\n \n angular.module('sky.grids.actionbar', ['sky.mediabreakpoints', 'sky.resources'])\n .directive('bbGridActionBar', ['bbMediaBreakpoints', 'bbResources', '$timeout', function (bbMediaBreakpoints, bbResources, $timeout) {\n return {\n require: '^bbGrid',\n replace: true,\n transclude: true,\n restrict: 'E',\n scope: {\n bbMultiselectActions: '=',\n bbSelectionsUpdated: '&'\n },\n controller: ['$scope', function ($scope) {\n $scope.locals = {\n actions: $scope.bbMultiselectActions,\n showActionBar: false,\n mobileButtons: false,\n showMobileActions: false\n };\n\n $scope.resources = bbResources;\n }],\n link: function ($scope, element, attrs, bbGrid) {\n /*jslint unparam: true */\n var visibleSelected = [];\n \n function updateActionBar(data, selected) {\n var action,\n i,\n showActionBar;\n \n //this notation is necessary because the argument is passed through grid and then to the controller\n //in which grid resides.\n visibleSelected = bbGrid.getVisibleSelections(data, selected);\n \n $scope.bbSelectionsUpdated({ selections: { selections: visibleSelected } });\n\n showActionBar = false;\n if ($scope.locals.actions) {\n //only show the action bar if an action has an available selection\n for (i = 0; i < $scope.locals.actions.length; i++) {\n action = $scope.locals.actions[i];\n if (action.selections.length > 0) {\n showActionBar = true;\n }\n }\n }\n \n $scope.locals.showActionBar = showActionBar;\n\n if (showActionBar) {\n $timeout(function () {\n bbGrid.syncActionBarViewKeeper();\n });\n }\n }\n \n \n bbGrid.scope.$watchCollection('selectedRows', function (newValue) {\n updateActionBar(bbGrid.scope.options.data, newValue);\n });\n\n bbGrid.scope.$watchCollection('options.data', function (newValue) {\n updateActionBar(newValue, bbGrid.scope.selectedRows);\n });\n \n //on mobile do an ng-if that changes the stuff.\n function mediaBreakpointHandler(newBreakpoints) {\n $scope.locals.mobileButtons = newBreakpoints.xs;\n }\n\n bbMediaBreakpoints.register(mediaBreakpointHandler);\n\n element.on('$destroy', function () {\n bbMediaBreakpoints.unregister(mediaBreakpointHandler);\n });\n\n $scope.locals.clearSelection = function () {\n \n //If the visible selections are the same as the selected rows we can just reset all multiselected rows\n if (visibleSelected.length === bbGrid.scope.selectedRows.length) {\n bbGrid.resetMultiselect();\n } else {\n bbGrid.toggleMultiselectRows(visibleSelected);\n }\n \n };\n\n $scope.locals.chooseAction = function () {\n $scope.locals.showMobileActions = true;\n };\n\n $scope.locals.cancelChooseAction = function () {\n $scope.locals.showMobileActions = false;\n };\n },\n templateUrl: 'sky/templates/grids/actionbar.html'\n };\n }]);\n}());", "/*global angular */\n\n(function () {\n 'use strict';\n angular.module('sky.grids.filters', ['sky.help', 'sky.resources', 'sky.mediabreakpoints'])\n .directive('bbGridFilters', ['bbHelp', 'bbResources', 'bbMediaBreakpoints', function (bbHelp, bbResources, bbMediaBreakpoints) {\n return {\n require: '^bbGrid',\n replace: true,\n transclude: true,\n restrict: 'E',\n scope: {\n bbOptions: \"=\"\n },\n controller: ['$scope', function ($scope) {\n $scope.applyFilters = function () {\n var args = {},\n options = $scope.bbOptions;\n\n if (options && options.applyFilters) {\n options.applyFilters(args);\n $scope.updateFilters(args.filters);\n\n if (bbMediaBreakpoints.getCurrent().xs) {\n $scope.locals.expanded = false;\n }\n }\n };\n $scope.clearFilters = function () {\n var args = {},\n options = $scope.bbOptions;\n\n if (options && options.clearFilters) {\n options.clearFilters(args);\n $scope.updateFilters(args.filters);\n }\n };\n }],\n link: function ($scope, element, attrs, bbGrid) {\n /*jslint unparam: true */\n var box = element.find('.bb-grid-filters-box'),\n filtersContainer = element.find('.bb-grid-filters-container');\n\n $scope.locals = {\n expanded: false\n };\n\n $scope.viewKeeperOptions = {};\n\n bbGrid.viewKeeperChangedHandler = function (val) {\n $scope.viewKeeperOptions.viewKeeperOffsetElId = val;\n };\n\n bbGrid.toggleFilterMenu = function (isOpen) {\n if (angular.isDefined(isOpen)) {\n $scope.locals.expanded = isOpen;\n } else {\n $scope.locals.expanded = !$scope.locals.expanded;\n }\n\n if ($scope.locals.expanded) {\n bbHelp.close();\n }\n };\n\n bbGrid.openFilterMenu = function () {\n $scope.locals.expanded = true;\n };\n\n bbGrid.scope.$watch('gridCreated', function (newValue) {\n if (newValue) {\n element.parents('.bb-grid-container').prepend(element);\n element.show();\n\n if ($scope.locals.expanded) {\n animateFilters($scope.locals.expanded);\n }\n }\n });\n\n $scope.updateFilters = function (filters) {\n bbGrid.setFilters(filters);\n };\n\n $scope.resources = bbResources;\n\n function animateFilters(isExpanded) {\n var animationDuration = 250;\n if (isExpanded) {\n box.css('left', '240px');\n filtersContainer.show();\n box.animate({ 'left': '0' }, animationDuration);\n } else {\n box.animate({ 'left': '240px' }, {\n duration: animationDuration,\n complete: function () {\n box.css('left', '0');\n filtersContainer.hide();\n }\n });\n }\n }\n\n $scope.$watch('locals.expanded', function (newValue, oldValue) {\n if (newValue !== oldValue || newValue) {\n animateFilters(newValue);\n }\n });\n\n },\n templateUrl: 'sky/templates/grids/filters.html'\n };\n }])\n .directive('bbGridFiltersGroup', function () {\n return {\n replace: true,\n transclude: true,\n restrict: 'E',\n scope: {\n bbGridFiltersGroupLabel: '=',\n isCollapsed: '=?bbGridFiltersGroupIsCollapsed'\n },\n templateUrl: 'sky/templates/grids/filtersgroup.html'\n };\n })\n .directive('bbGridFiltersSummary', ['bbResources', function (bbResources) {\n return {\n require: '^bbGrid',\n replace: true,\n transclude: true,\n restrict: 'E',\n scope: {\n bbOptions: \"=\"\n },\n controller: ['$scope', function ($scope) {\n $scope.clearFilters = function () {\n var args = {},\n options = $scope.bbOptions;\n\n if (options && options.clearFilters) {\n options.clearFilters(args);\n $scope.updateFilters(args.filters);\n }\n };\n\n $scope.resources = bbResources;\n\n }],\n link: function ($scope, element, attrs, bbGrid) {\n /*jslint unparam: true */\n\n bbGrid.scope.$watch('gridCreated', function () {\n var toolbarContainer = element.parents('.bb-grid-container').find('.bb-grid-toolbar-container .bb-grid-filter-summary-container');\n toolbarContainer.append(element);\n });\n\n\n $scope.updateFilters = function (filters) {\n bbGrid.setFilters(filters);\n };\n\n $scope.openFilterMenu = function () {\n if (bbGrid.openFilterMenu) {\n bbGrid.openFilterMenu();\n }\n };\n $scope.$watch(function () {\n return element.is(':visible');\n }, function (newValue, oldValue) {\n if (newValue !== oldValue) {\n bbGrid.syncViewKeepers();\n }\n });\n },\n templateUrl: 'sky/templates/grids/filterssummary.html'\n };\n }]);\n\n}());\n", "/*jslint plusplus: true */\n/*global angular, jQuery */\n\n(function ($) {\n 'use strict';\n\n var DEFAULT_ITEMS_PER_PAGE = 5,\n DEFAULT_MAX_PAGES = 5,\n DEFAULT_COLUMN_SIZE = 150,\n MULTISELECT_COLUMN_SIZE = 35,\n DROPDOWN_TOGGLE_COLUMN_SIZE = 40,\n DROPDOWN_TOGGLE_COLUMN_NAME = 'dropdownToggle',\n MULTISELECT_COLUMN_NAME = 'cb';\n\n\n function arrayObjectIndexOf(array, obj) {\n var i;\n for (i = 0; i < array.length; i++) {\n if (angular.equals(array[i], obj)) {\n return i;\n }\n }\n return -1;\n }\n\n angular.module('sky.grids', ['sky.contextmenu', 'sky.mediabreakpoints', 'sky.viewkeeper', 'sky.highlight', 'sky.resources', 'sky.data', 'sky.grids.filters', 'sky.grids.actionbar', 'sky.window', 'sky.grids.toolbar'])\n .controller('bbGridContextMenuController', ['$scope', function ($scope) {\n function toggleDropdown($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $scope.locals.is_open = !$scope.locals.is_open;\n }\n\n $scope.locals = {\n is_open: false,\n items: [],\n toggleDropdown: toggleDropdown\n };\n\n /*istanbul ignore else: sanity check */\n if (angular.isFunction($scope.getContextMenuItems)) {\n $scope.locals.items = $scope.getContextMenuItems($scope.rowData.id, $scope.rowData);\n }\n }])\n\n\n .directive('bbGrid', ['$window', '$compile', '$templateCache', 'bbMediaBreakpoints', 'bbViewKeeperBuilder', 'bbHighlight', 'bbResources', 'bbData', '$controller', '$timeout', 'bbWindow', '$q',\n\n function ($window, $compile, $templateCache, bbMediaBreakpoints, bbViewKeeperBuilder, bbHighlight, bbResources, bbData, $controller, $timeout, bbWindow, $q) {\n return {\n replace: true,\n transclude: true,\n restrict: 'E',\n scope: {\n options: '=bbGridOptions',\n multiselectActions: '=?bbMultiselectActions',\n updateMultiselectActions: '&bbSelectionsUpdated',\n paginationOptions: '=?bbGridPagination',\n selectedRows: '=?bbSelectedRows'\n },\n controller: ['$scope', function ($scope) {\n var locals,\n self = this;\n\n self.setFilters = function (filters) {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(locals.setFilters)) {\n locals.setFilters(filters);\n }\n };\n\n self.syncViewKeepers = function () {\n /*istanbul ignore else: sanity check */\n if ($scope.syncViewKeepers) {\n $scope.syncViewKeepers();\n }\n };\n\n self.syncActionBarViewKeeper = function () {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction($scope.syncActionBarViewKeeper)) {\n $scope.syncActionBarViewKeeper();\n }\n };\n\n self.resetMultiselect = function () {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(locals.resetMultiselect)) {\n locals.resetMultiselect();\n }\n };\n\n self.getVisibleSelections = function (data, selected) {\n var i,\n index,\n result = [];\n\n for (i = 0; i < selected.length; i++) {\n index = arrayObjectIndexOf(data, selected[i]);\n if (index > -1) {\n result.push(selected[i]);\n }\n }\n return result;\n };\n\n self.toggleMultiselectRows = function (visibleSelectedRows) {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(locals.toggleMultiselectRows)) {\n locals.toggleMultiselectRows(visibleSelectedRows);\n }\n };\n\n self.syncGridHeaderScrollToTopScrollbar = function () {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(locals.topScrollbarScroll)) {\n locals.topScrollbarScroll();\n }\n };\n\n self.highlightSearchText = function () {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(locals.highlightSearchText)) {\n locals.highlightSearchText();\n }\n };\n\n self.scope = $scope;\n\n $scope.resources = bbResources;\n\n locals = $scope.locals = {\n gridId: 'bbgrid-table-' + $scope.$id,\n hasAdd: false,\n hasColPicker: true,\n hasFilters: true,\n applySearchText: function () {\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(self.applySearchText)) {\n self.applySearchText();\n }\n }\n };\n\n $scope.$watch('options.viewKeeperOffsetElId', function (newValue, oldValue) {\n if (newValue !== oldValue) {\n if (self.viewKeeperChangedHandler) {\n self.viewKeeperChangedHandler(newValue);\n }\n }\n });\n }],\n link: function ($scope, element, attr) {\n $scope.customToolbar = {\n hasCustomToolbar: false\n };\n $scope.customToolbar.hasCustomToolbar = angular.isDefined(attr.bbGridCustomToolbar);\n\n $scope.$watch('locals.hasCustomToolbar', function () {\n var breakpoints = {},\n cellScopes,\n columnCount = 0,\n columnModel,\n compiledTemplates = [],\n currentExtendedColumnWidth,\n extendedColumnIndex,\n extendedColumnName,\n fullGrid,\n getContextMenuItems,\n hasTemplatedColumns,\n header,\n id,\n locals = $scope.locals,\n localRowSelect = false,\n needsExtendedColumnResize,\n originalExtendedColumnWidth,\n seemore_template = 'sky/templates/grids/seemore.html',\n dropdown_template = 'sky/templates/grids/dropdown.html',\n reorderingColumns,\n tableBody,\n tableEl = element.find('table'),\n tableDomEl = tableEl[0],\n tableWrapper = element.find('.table-responsive'),\n tableWrapperWidth,\n toolbarContainer = element.find('.bb-grid-toolbar-viewkeeper'),\n toolbarContainerId,\n totalColumnWidth,\n verticalOffSetElId,\n vkActionBarAndBackToTop,\n vkToolbars,\n vkHeader,\n windowEl = $($window),\n windowEventId,\n resizeStartColWidth,\n hasPristineColumns = true,\n doNotResetRows = false;\n\n function getTopScrollbar() {\n return element.find('.bb-grid-top-scrollbar');\n }\n\n function getTopScrollbarDiv() {\n return element.find('.bb-grid-top-scrollbar > div');\n }\n\n function updateGridLoadedTimestampAndRowCount(count) {\n $scope.locals.timestamp = new Date().getTime();\n $scope.locals.rowcount = count;\n }\n\n function reInitGrid() {\n if ($scope.options && $scope.options.selectedColumnIds && $scope.options.selectedColumnIds.length > 0 && tableEl[0].grid) {\n\n initGrid();\n\n if ($scope.options.data && $scope.options.data.length > 0) {\n setRows($scope.options.data);\n }\n }\n }\n\n function mediaBreakpointHandler(newBreakpoints) {\n breakpoints = newBreakpoints;\n reInitGrid();\n }\n\n function buildColumnClasses(column) {\n var classes = '';\n\n //if this column does not allow search then add the appropriate class. This is used when highlighting search results\n if (column.exclude_from_search) {\n classes += \"bb-grid-no-search \";\n }\n\n return classes;\n }\n\n function getEmptyString() {\n return '';\n }\n\n function buildCellAttribute(rowId, cellValue, rawObject, column) {\n /*jslint unparam: true*/\n return \"data-grid-field='\" + column.name + \"'\" + \"data-bbauto-field='\" + column.name + \"'\" + \"data-bbauto-index='\" + (tableEl.getInd(rowId) - 1) + \"'\";\n }\n\n function getColumnById(columns, id) {\n var column,\n i;\n\n for (i = 0; i < columns.length; i++) {\n column = columns[i];\n if (column.id === id) {\n return column;\n }\n }\n }\n\n function resetExtendedColumn() {\n //wipe out extended column stuff\n extendedColumnName = null;\n currentExtendedColumnWidth = null;\n originalExtendedColumnWidth = null;\n extendedColumnIndex = null;\n needsExtendedColumnResize = false;\n }\n\n function getBreakpointsWidth(column) {\n var columnDefault;\n\n if (column.width_all > 0) {\n columnDefault = column.width_all;\n } else {\n columnDefault = DEFAULT_COLUMN_SIZE;\n }\n\n if (breakpoints.xs) {\n return column.width_xs > 0 ? column.width_xs : columnDefault;\n } else if (breakpoints.sm) {\n return column.width_sm > 0 ? column.width_sm : columnDefault;\n } else if (breakpoints.md) {\n return column.width_md > 0 ? column.width_md : columnDefault;\n } else if (breakpoints.lg) {\n return column.width_lg > 0 ? column.width_lg : columnDefault;\n }\n\n return columnDefault;\n }\n\n function buildColumnModel(columns, selectedColumnIds) {\n var colModel = [],\n column,\n colWidth,\n index,\n gridColumn;\n\n hasTemplatedColumns = false;\n\n if (getContextMenuItems) {\n colModel.push({\n classes: 'bb-grid-dropdown-cell',\n fixed: true,\n sortable: false,\n name: DROPDOWN_TOGGLE_COLUMN_NAME,\n label: ' ',\n width: DROPDOWN_TOGGLE_COLUMN_SIZE,\n title: false,\n hidedlg: true,\n resizable: false,\n search: false,\n template_url: dropdown_template,\n controller: 'bbGridContextMenuController',\n cellattr: buildCellAttribute,\n formatter: getEmptyString,\n is_context_menu: true\n });\n\n /*istanbul ignore else: sanity check */\n if (!compiledTemplates[dropdown_template]) {\n compiledTemplates[dropdown_template] = $compile($templateCache.get(dropdown_template));\n }\n\n hasTemplatedColumns = true;\n\n totalColumnWidth = totalColumnWidth + DROPDOWN_TOGGLE_COLUMN_SIZE;\n }\n\n\n resetExtendedColumn();\n\n for (index = 0; index < selectedColumnIds.length; index++) {\n column = getColumnById(columns, selectedColumnIds[index]);\n\n if (column) {\n\n colWidth = getBreakpointsWidth(column);\n\n //If this is the last selected column and the sum of the columns is shorter than the area available, extend the last column\n if ((index === (selectedColumnIds.length - 1)) && (tableWrapper.width() > (colWidth + totalColumnWidth))) {\n needsExtendedColumnResize = true;\n originalExtendedColumnWidth = colWidth;\n extendedColumnName = column.name;\n extendedColumnIndex = index;\n\n //If multiselect and/or contextmenu exist, then the last column index is shifted.\n if (locals.multiselect) {\n extendedColumnIndex = extendedColumnIndex + 1;\n }\n if (getContextMenuItems) {\n extendedColumnIndex = extendedColumnIndex + 1;\n }\n\n colWidth = tableWrapper.width() - totalColumnWidth;\n currentExtendedColumnWidth = colWidth;\n }\n\n gridColumn = {\n index: column.id.toString(),\n sortable: false,\n id: column.id,\n name: column.name,\n label: column.caption,\n align: (column.right_align ? 'right' : (column.center_align ? 'center' : 'left')),\n classes: buildColumnClasses(column),\n cellattr: buildCellAttribute,\n controller: column.controller,\n template_url: column.template_url,\n jsonmap: column.jsonmap,\n allow_see_more: column.allow_see_more,\n width: colWidth\n };\n\n if (column.allow_see_more && !gridColumn.template_url) {\n gridColumn.template_url = seemore_template;\n\n if (!compiledTemplates[seemore_template]) {\n compiledTemplates[seemore_template] = $compile($templateCache.get(seemore_template));\n }\n }\n\n if (gridColumn.template_url) {\n //Setup a formatter to return an empty string until the\n //angular template is processed for the cell.\n gridColumn.formatter = getEmptyString;\n hasTemplatedColumns = true;\n } else if (column.colFormatter) {\n gridColumn.formatter = column.colFormatter;\n }\n\n colModel.push(gridColumn);\n\n totalColumnWidth = totalColumnWidth + colWidth;\n }\n }\n\n return colModel;\n }\n\n function getColumnElementIdFromName(columnName) {\n return locals.gridId + \"_\" + columnName;\n }\n\n function getColumnNameFromElementId(columnName) {\n /*istanbul ignore else: sanity check */\n if (columnName) {\n return columnName.replace(locals.gridId + \"_\", \"\");\n }\n }\n\n function getDesiredGridWidth() {\n var width = tableWrapper.width();\n\n if (width < totalColumnWidth) {\n width = totalColumnWidth;\n tableWrapper.addClass('bb-grid-table-wrapper-overflow');\n } else {\n tableWrapper.addClass('bb-grid-table-wrapper');\n }\n\n return width;\n }\n\n function setScrollbarHeight() {\n var topScrollbar = getTopScrollbar(),\n topScrollbarDiv = getTopScrollbarDiv(),\n scrollbarWidth = bbWindow.getScrollbarWidth();\n\n if (totalColumnWidth > (topScrollbar.width()) && !breakpoints.xs) {\n topScrollbar.height(scrollbarWidth);\n topScrollbarDiv.height(scrollbarWidth);\n } else {\n topScrollbar.height(0);\n topScrollbarDiv.height(0);\n }\n }\n\n function resetTopScrollbar() {\n var topScrollbarDiv = getTopScrollbarDiv();\n topScrollbarDiv.width(totalColumnWidth);\n setScrollbarHeight();\n }\n\n function setColumnSize(columnName, columnSize, totalWidth) {\n var gridHeaders,\n colSizePx = columnSize + 'px',\n bodyScrollLeft,\n tableGrid = tableEl[0].grid;\n\n gridHeaders = tableGrid.headers;\n bodyScrollLeft = tableGrid.bDiv.scrollLeft;\n /* jqGrid does not provide a function to change a single column column size.\n This code snippet mirrors how jqGrid changes column size in their own dragEnd\n function.\n */\n tableEl[0].p.colModel[extendedColumnIndex].width = columnSize;\n gridHeaders[extendedColumnIndex].width = columnSize;\n gridHeaders[extendedColumnIndex].el.style.width = colSizePx;\n tableGrid.cols[extendedColumnIndex].style.width = colSizePx;\n /* istanbul ignore next: sanity check */\n tableEl[0].p.tblwidth = totalWidth || tableEl[0].p.tblwidth;\n tableGrid.hDiv.scrollLeft = bodyScrollLeft;\n }\n\n function resizeExtendedColumn(changedWidth, isIncreasing) {\n var extendedShrinkWidth = currentExtendedColumnWidth - originalExtendedColumnWidth;\n\n //If the extended portion of the last column is less than the amount resized\n if (extendedShrinkWidth <= changedWidth) {\n //decrease extended column to original size\n\n\n //increase grid width by remainder and wipe out all the extended stuff\n if (isIncreasing) {\n totalColumnWidth = totalColumnWidth + (changedWidth - extendedShrinkWidth);\n } else {\n totalColumnWidth = totalColumnWidth - extendedShrinkWidth;\n }\n setColumnSize(extendedColumnName, originalExtendedColumnWidth, totalColumnWidth);\n\n tableWrapper.addClass('bb-grid-table-wrapper-overflow');\n resetExtendedColumn();\n\n } else {\n //decrease extended column width by changedWidth\n currentExtendedColumnWidth = currentExtendedColumnWidth - changedWidth;\n\n\n if (!isIncreasing) {\n totalColumnWidth = totalColumnWidth - changedWidth;\n }\n setColumnSize(extendedColumnName, currentExtendedColumnWidth, totalColumnWidth);\n\n }\n tableEl.setGridWidth(totalColumnWidth, false);\n resetTopScrollbar();\n }\n\n function resetGridWidth(oldWidth, newWidth) {\n var changedWidth,\n topScrollbar = getTopScrollbar(),\n width;\n\n topScrollbar.width(tableWrapper.width());\n if (needsExtendedColumnResize && newWidth < oldWidth) {\n changedWidth = oldWidth - newWidth;\n resizeExtendedColumn(changedWidth, false);\n } else {\n if (totalColumnWidth === oldWidth) {\n totalColumnWidth = newWidth;\n }\n\n width = getDesiredGridWidth();\n\n /*istanbul ignore else: sanity check */\n if (width > 0) {\n tableEl.setGridWidth(width);\n resetTopScrollbar();\n }\n }\n }\n\n function getLastIndex() {\n var lastIndex = $scope.options.selectedColumnIds.length - 1;\n\n if (locals.multiselect) {\n lastIndex = lastIndex + 1;\n }\n if (getContextMenuItems) {\n lastIndex = lastIndex + 1;\n }\n\n return lastIndex;\n }\n\n function resizeStart(event, index) {\n var lastIndex = getLastIndex(),\n jqGridEl,\n thEls;\n\n hasPristineColumns = false;\n\n jqGridEl = element.find('.ui-jqgrid');\n\n //if resizing last element and tableEl smaller than table wrapper\n\n if (index === lastIndex && tableWrapperWidth > jqGridEl.width()) {\n //increase width of child of table-responsive\n jqGridEl.width(tableWrapperWidth);\n //increase width of hdiv\n element.find('.ui-jqgrid-hdiv').width(tableWrapperWidth);\n //make padding right on tr of headers\n element.find('.ui-jqgrid-hdiv tr').css('padding-right', tableWrapperWidth.toString() + 'px');\n }\n\n fullGrid.find('.ui-jqgrid-resize-mark').height(fullGrid.height());\n thEls = element.find('.ui-jqgrid .ui-jqgrid-hdiv .ui-jqgrid-htable th');\n resizeStartColWidth = parseInt(thEls[index].style.width);\n\n }\n\n function syncHeaderToTableWrapper() {\n if (vkHeader && vkHeader.isFixed) {\n header.width(tableWrapper.width());\n header.scrollLeft(tableWrapper.scrollLeft());\n }\n }\n\n function resizeStop(newWidth, index) {\n var changedWidth,\n resizedColumnIndex = index;\n\n //If multiselect and/or contextmenu exist, then the resized column index is shifted.\n if (locals.multiselect) {\n resizedColumnIndex = resizedColumnIndex - 1;\n }\n if (getContextMenuItems) {\n resizedColumnIndex = resizedColumnIndex - 1;\n }\n\n $scope.$emit(\"columnsResized\", { newWidth: newWidth, index: resizedColumnIndex });\n\n tableWrapper.addClass('bb-grid-table-wrapper-overflow');\n\n changedWidth = newWidth - resizeStartColWidth;\n\n //If your last column was extended and this is the first resize\n if (needsExtendedColumnResize) {\n //If the column you're resizing is not the extended column and you're increasing the size\n if (index !== extendedColumnIndex && changedWidth > 0) {\n\n resizeExtendedColumn(changedWidth, true);\n\n resetExtendedColumn();\n syncHeaderToTableWrapper();\n\n return;\n }\n resetExtendedColumn();\n }\n\n totalColumnWidth = totalColumnWidth + changedWidth;\n tableEl.setGridWidth(totalColumnWidth, false);\n resetTopScrollbar();\n syncHeaderToTableWrapper();\n\n return;\n }\n\n function setSortStyles() {\n var className,\n headerElId,\n sortOptions;\n /*istanbul ignore else: sanity check */\n if (header) {\n header.find('th').removeClass('sorting-asc').removeClass('sorting-desc');\n /* istanbul ignore else: sanity check */\n if ($scope.options) {\n sortOptions = $scope.options.sortOptions;\n if (sortOptions && sortOptions.column) {\n headerElId = getColumnElementIdFromName(sortOptions.column);\n\n if (sortOptions.descending) {\n className = 'sorting-desc';\n } else {\n className = 'sorting-asc';\n }\n\n header.find('#' + headerElId).addClass(className);\n }\n }\n }\n }\n\n function columnIsSortable(columnName) {\n var excludedColumns,\n sortOptions = $scope.options.sortOptions;\n\n if (columnName === DROPDOWN_TOGGLE_COLUMN_NAME || columnName === MULTISELECT_COLUMN_NAME) {\n return false;\n }\n\n\n /*istanbul ignore else: sanity check */\n if (sortOptions) {\n excludedColumns = sortOptions.excludedColumns;\n if (excludedColumns) {\n if (excludedColumns.indexOf(columnName) > -1) {\n return false;\n }\n }\n }\n return true;\n }\n\n function highlightSearchText() {\n var options = $scope.options;\n if (options && options.searchText) {\n bbHighlight(tableEl.find(\"td\").not('.bb-grid-no-search'), options.searchText, 'highlight');\n } else {\n bbHighlight.clear(tableEl);\n }\n }\n\n function linkCellValue(scope, cell, linkFunction) {\n linkFunction(scope, function (cloned) {\n cell.append(cloned);\n });\n }\n\n function afterInsertRow(rowid, rowdata, rowelem) {\n /*jshint validthis: true */\n var cell,\n column,\n columnData,\n i,\n itemScope,\n row,\n rowIndex;\n\n if (hasTemplatedColumns) {\n\n if (!tableBody) {\n tableBody = $(this);\n }\n\n row = tableBody.find('#' + rowid);\n\n for (i = 0; i < columnModel.length; i++) {\n column = columnModel[i];\n\n if (column.template_url) {\n\n cell = row.find('[data-grid-field=\"' + column.name + '\"]');\n columnData = rowdata[column.name];\n\n //Create a new scope and apply the cell object's properties to it.\n itemScope = $scope.$new(true);\n\n itemScope.data = columnData;\n itemScope.rowData = rowelem;\n\n if (column.allow_see_more) {\n itemScope.skyResources = $scope.resources;\n }\n\n if (column.is_context_menu) {\n itemScope.getContextMenuItems = getContextMenuItems;\n }\n\n //make the resources from the caller available to the column templates\n if ($scope.options.resources) {\n itemScope.resources = $scope.options.resources;\n }\n\n if (column.controller) {\n $controller(column.controller, {\n $scope: itemScope\n });\n }\n\n cellScopes.push(itemScope); //Stash scope for cleanup later.\n\n linkCellValue(itemScope, cell, compiledTemplates[column.template_url]);\n }\n }\n }\n\n rowIndex = tableEl.getInd(rowid);\n\n //check if row should be multiselected\n if ($scope.selectedRows && $scope.selectedRows.length > 0) {\n\n row = $scope.options.data[(rowIndex - 1)];\n if (row && arrayObjectIndexOf($scope.selectedRows, row) > -1) {\n tableEl.setSelection(rowid, false);\n }\n }\n }\n\n function setColumnHeaderAlignment() {\n var alignmentClass,\n column,\n i;\n\n for (i = 0; i < columnModel.length; i++) {\n column = columnModel[i];\n if (column.align === 'center') {\n alignmentClass = 'bb-grid-th-center';\n } else if (column.align === 'right') {\n alignmentClass = 'bb-grid-th-right';\n } else {\n alignmentClass = 'bb-grid-th-left';\n }\n\n tableEl.setLabel(column.name, '', alignmentClass);\n\n }\n }\n\n function gridComplete() {\n setColumnHeaderAlignment();\n }\n\n function gridColumnsReordered(orderedColumns) {\n var i,\n offset = 0,\n oldIndex,\n selectedColumnIds = $scope.options.selectedColumnIds,\n newSelectedColumnIds = [];\n\n resetExtendedColumn();\n\n //Need to account for context menu if it exists. It will always be the first\n //column before and after the reorder\n if (angular.isFunction(getContextMenuItems)) {\n offset += 1;\n }\n\n if (locals.multiselect) {\n offset += 1;\n }\n\n for (i = offset; i < orderedColumns.length; i++) {\n oldIndex = orderedColumns[i];\n newSelectedColumnIds.push(selectedColumnIds[oldIndex - offset]);\n }\n\n reorderingColumns = true;\n $scope.options.selectedColumnIds = newSelectedColumnIds;\n $scope.$apply();\n }\n\n function getSortable() {\n /* The clone option for jquery ui clones the element that is being dragged.\n This prevents the click event from being invoked while users are reordering\n columns http://api.jqueryui.com/sortable/#option-helper\n */\n var sortable = {\n update: gridColumnsReordered,\n options: {\n helper: 'clone'\n }\n\n };\n\n if (getContextMenuItems) {\n sortable.exclude = \"#\" + $scope.locals.gridId + \"_\" + DROPDOWN_TOGGLE_COLUMN_NAME;\n }\n return sortable;\n }\n\n function clearSelectedRowsObject() {\n $scope.selectedRows = [];\n }\n\n\n function resetMultiselect() {\n clearSelectedRowsObject();\n tableEl.resetSelection();\n }\n\n\n\n function onSelectAll(rowIds, status) {\n /*jslint unparam: true */\n var allRowData;\n\n localRowSelect = true;\n\n clearSelectedRowsObject();\n\n if (status === true) {\n allRowData = $scope.options.data;\n if (allRowData && allRowData.length > 0) {\n $scope.selectedRows = allRowData.slice();\n }\n }\n $scope.$apply();\n }\n\n\n function toggleMultiselectRows(visibleSelectedRows) {\n var i,\n index,\n rowIds;\n\n rowIds = tableEl.getDataIDs();\n\n for (i = 0; i < visibleSelectedRows.length; i++) {\n index = arrayObjectIndexOf($scope.options.data, visibleSelectedRows[i]);\n tableEl.setSelection(rowIds[index], true);\n }\n }\n\n\n function onSelectRow(rowId, status) {\n $timeout(function () {\n var index,\n rowIndex = tableEl.getInd(rowId),\n row;\n row = $scope.options.data[(rowIndex - 1)];\n\n localRowSelect = true;\n\n index = arrayObjectIndexOf($scope.selectedRows, row);\n\n if (status === true && index === -1 && row) {\n $scope.selectedRows.push(row);\n } else if (status === false && index > -1) {\n $scope.selectedRows.splice(index, 1);\n }\n });\n }\n\n function setMultiselectRow(rowId, rowIndex) {\n var row;\n\n tableEl.setSelection(rowId, false);\n row = $scope.options.data[(rowIndex - 1)];\n $scope.selectedRows.push(row);\n }\n\n function beforeSelectRow(rowId, e) {\n var endIndex,\n i,\n lastSelectedRow,\n rowIds,\n startIndex = parseInt(tableEl.getInd(rowId));\n\n localRowSelect = true;\n\n if (e.shiftKey) {\n lastSelectedRow = tableEl.getInd(tableEl.getGridParam('selrow'));\n resetMultiselect();\n\n //if lastSelectedRow is undefined or null, set to 1\n if (angular.isUndefined(lastSelectedRow) || lastSelectedRow === null) {\n lastSelectedRow = 1;\n }\n\n endIndex = parseInt(lastSelectedRow);\n\n rowIds = tableEl.getDataIDs();\n\n //set shift click selection first so last selected row is set properly\n if (endIndex < startIndex) {\n for (i = startIndex; i > endIndex - 1; i = i - 1) {\n setMultiselectRow(rowIds[(i - 1)], i);\n }\n } else if (endIndex > startIndex) {\n for (i = startIndex; i < endIndex + 1; i = i + 1) {\n setMultiselectRow(rowIds[(i - 1)], i);\n }\n } else {\n $scope.$apply();\n return true;\n }\n\n $scope.$apply();\n return false;\n }\n return true;\n }\n\n function pageChanged() {\n var skip = ($scope.paginationOptions.currentPage - 1) * $scope.paginationOptions.itemsPerPage,\n top = $scope.paginationOptions.itemsPerPage;\n\n $scope.$emit('loadMoreRows', {top: top, skip: skip});\n\n }\n\n function initializePagination() {\n if (angular.isDefined($scope.paginationOptions)) {\n\n if (!$scope.paginationOptions.itemsPerPage) {\n $scope.paginationOptions.itemsPerPage = DEFAULT_ITEMS_PER_PAGE;\n }\n\n if (!$scope.paginationOptions.maxPages) {\n $scope.paginationOptions.maxPages = DEFAULT_MAX_PAGES;\n }\n\n if (!$scope.paginationOptions.currentPage) {\n $scope.paginationOptions.currentPage = 1;\n }\n\n $scope.paginationOptions.pageChanged = pageChanged;\n\n\n }\n }\n\n function fancyCheckOff() {\n element.find('td .bb-check-checkbox').off();\n }\n\n function wrapCheckboxEl(checkboxEl) {\n checkboxEl.wrap('');\n checkboxEl.after('');\n }\n\n function setUpFancyCheckHeader() {\n var headerCheckEl = header.find('th .cbox');\n wrapCheckboxEl(headerCheckEl);\n }\n\n function setUpFancyCheckCell() {\n var checkCellEl = element.find('td > .cbox');\n wrapCheckboxEl(checkCellEl);\n element.find('td .bb-check-checkbox').on('click', function (event) {\n event.preventDefault();\n });\n }\n\n function getIdPrefix() {\n return 'bb-grid-row-' + $scope.$id + '-';\n }\n\n function initGrid() {\n var columns,\n jqGridOptions,\n selectedColumnIds,\n useGridView = true,\n hoverrows = false;\n\n totalColumnWidth = 0;\n\n hasPristineColumns = true;\n\n tableWrapperWidth = tableWrapper.width();\n\n locals.multiselect = false;\n\n //Clear reference to the table body since it will be recreated.\n tableBody = null;\n\n //Unload grid if it already exists.\n tableEl.jqGrid('GridUnload');\n fancyCheckOff();\n\n tableEl = element.find('table');\n tableDomEl = tableEl[0];\n\n /*istanbul ignore else: sanity check */\n if ($scope.options) {\n\n columns = $scope.options.columns;\n selectedColumnIds = $scope.options.selectedColumnIds;\n getContextMenuItems = $scope.options.getContextMenuItems;\n\n if ($scope.options.multiselect) {\n locals.multiselect = true;\n hoverrows = true;\n\n totalColumnWidth = totalColumnWidth + MULTISELECT_COLUMN_SIZE;\n }\n $scope.searchText = $scope.options.searchText;\n }\n\n // Allow grid styles to be changed when grid is in multiselect mode (such as the\n // header checkbox alignment).\n element[locals.multiselect ? 'addClass' : 'removeClass']('bb-grid-multiselect');\n\n\n if (getContextMenuItems) {\n useGridView = false;\n }\n\n if (columns && selectedColumnIds) {\n\n\n columnModel = buildColumnModel(columns, selectedColumnIds);\n columnCount = columnModel.length;\n\n jqGridOptions = {\n afterInsertRow: afterInsertRow,\n autoencode: true,\n beforeSelectRow: beforeSelectRow,\n colModel: columnModel,\n datatype: angular.noop,\n gridComplete: gridComplete,\n gridView: useGridView,\n height: 'auto',\n hoverrows: hoverrows,\n idPrefix: getIdPrefix(),\n multiselect: locals.multiselect,\n multiselectWidth: MULTISELECT_COLUMN_SIZE,\n onSelectAll: onSelectAll,\n onSelectRow: onSelectRow,\n resizeStart: resizeStart,\n resizeStop: resizeStop,\n rowNum: -1,\n shrinktofit: false,\n sortable: getSortable(),\n width: getDesiredGridWidth()\n };\n\n\n tableEl.jqGrid(jqGridOptions);\n\n header = $(tableDomEl.grid.hDiv);\n\n //Attach click handler for sorting columns\n header.find('th').on('click', function () {\n var sortOptions = $scope.options.sortOptions,\n columnName;\n\n if (!sortOptions) {\n sortOptions = $scope.options.sortOptions = {};\n }\n\n columnName = getColumnNameFromElementId(this.id);\n\n if (columnIsSortable(columnName)) {\n sortOptions.column = columnName;\n sortOptions.descending = $(this).hasClass('sorting-asc');\n $scope.$apply();\n }\n });\n\n fullGrid = header.parents('.ui-jqgrid:first');\n\n if (vkHeader) {\n vkHeader.destroy();\n }\n\n $scope.locals.showToolbar = true;\n\n getTopScrollbar().width(tableWrapper.width());\n resetTopScrollbar();\n\n if (!$scope.options.fixedToolbar) {\n vkHeader = new bbViewKeeperBuilder.create({\n el: header[0],\n boundaryEl: tableWrapper[0],\n verticalOffSetElId: toolbarContainerId,\n setWidth: true,\n onStateChanged: function () {\n if (vkHeader.isFixed) {\n header.scrollLeft(tableWrapper.scrollLeft());\n } else {\n header.scrollLeft(0);\n }\n\n }\n });\n }\n\n setSortStyles();\n\n setUpFancyCheckHeader();\n\n $scope.gridCreated = true;\n\n }\n\n }\n\n function destroyCellScopes() {\n var i;\n if (cellScopes) {\n for (i = 0; i < cellScopes.length; i++) {\n cellScopes[i].$destroy();\n }\n }\n cellScopes = [];\n }\n\n function loadColumnTemplates(callback) {\n var columns,\n templateUrlsToLoad = {};\n\n //Identify any template URLs that haven't been compiled\n /*istanbul ignore else: sanity check */\n if ($scope.options) {\n columns = $scope.options.columns;\n /*istanbul ignore else: sanity check */\n if (columns) {\n angular.forEach(columns, function (column) {\n var templateUrl = column.template_url;\n\n if (templateUrl && !compiledTemplates[templateUrl]) {\n templateUrlsToLoad[templateUrl] = templateUrl;\n }\n });\n }\n }\n\n //Load template URLs that need compiling\n bbData.load({\n text: templateUrlsToLoad\n }).then(function (result) {\n var p,\n template;\n\n // Compile templates and store them for use when adding rows.\n for (p in result.text) {\n /*istanbul ignore else: sanity check */\n if (result.text.hasOwnProperty(p)) {\n template = result.text[p];\n\n /*istanbul ignore else: sanity check */\n if (template) {\n compiledTemplates[p] = $compile(template);\n }\n }\n }\n\n callback();\n });\n }\n\n function handleTableWrapperResize() {\n var newWidth = tableWrapper.width(),\n topScrollbar = getTopScrollbar();\n\n if (tableWrapperWidth && tableWrapperWidth !== newWidth) {\n if (hasPristineColumns) {\n resetGridWidth(tableWrapperWidth, newWidth);\n } else {\n topScrollbar.width(newWidth);\n }\n tableWrapperWidth = newWidth;\n } else {\n tableWrapperWidth = newWidth;\n }\n }\n\n function setRows(rows) {\n /*istanbul ignore else: sanity check */\n if (tableDomEl.addJSONData) {\n loadColumnTemplates(function () {\n\n if (locals.multiselect) {\n element.find('td').off('mousedown.gridmousedown');\n }\n\n tableEl.resetSelection();\n\n fancyCheckOff();\n\n destroyCellScopes();\n tableDomEl.addJSONData(rows);\n $timeout(highlightSearchText);\n handleTableWrapperResize();\n /*istanbul ignore next: sanity check */\n updateGridLoadedTimestampAndRowCount(rows ? rows.length : 0);\n\n setUpFancyCheckCell();\n\n });\n }\n }\n\n function setupToolbarViewKeepers() {\n if (vkToolbars) {\n vkToolbars.destroy();\n }\n\n if (vkActionBarAndBackToTop) {\n vkActionBarAndBackToTop.destroy();\n }\n\n /*istanbul ignore else: sanity check */\n if ($scope.options) {\n verticalOffSetElId = $scope.options.viewKeeperOffsetElId;\n }\n\n if (!$scope.options || !$scope.options.fixedToolbar) {\n vkToolbars = new bbViewKeeperBuilder.create({\n el: toolbarContainer[0],\n boundaryEl: tableWrapper[0],\n setWidth: true,\n verticalOffSetElId: verticalOffSetElId,\n onStateChanged: function () {\n $timeout(function () {\n locals.isScrolled = vkToolbars.isFixed;\n });\n }\n });\n }\n\n\n vkActionBarAndBackToTop = new bbViewKeeperBuilder.create({\n el: element.find('.bb-grid-action-bar-and-back-to-top')[0],\n boundaryEl: element[0],\n setWidth: true,\n verticalOffSetElId: verticalOffSetElId,\n fixToBottom: true\n });\n }\n\n function backToTop() {\n vkToolbars.scrollToTop();\n }\n\n locals.resetMultiselect = resetMultiselect;\n\n locals.toggleMultiselectRows = toggleMultiselectRows;\n\n locals.highlightSearchText = highlightSearchText;\n\n locals.setFilters = function (filters) {\n $scope.options.filters = filters;\n $scope.locals.applySearchText();\n };\n\n function loadMore() {\n var deferred = $q.defer(),\n loadMorePromise = deferred.promise;\n\n loadMorePromise.then(function (moreRows) {\n tableEl.addRowData('', moreRows);\n $scope.options.data = $scope.options.data.concat(moreRows);\n setUpFancyCheckCell();\n doNotResetRows = true;\n });\n\n $scope.$emit('loadMoreRows', {\n promise: deferred\n });\n\n }\n\n $scope.locals.loadMore = loadMore;\n\n if (angular.isUndefined($scope.selectedRows) || !angular.isArray($scope.selectedRows)) {\n $scope.selectedRows = [];\n }\n\n id = $scope.$id;\n toolbarContainerId = id + '-toolbar-container';\n\n locals.backToTop = backToTop;\n\n //Apply unique id to the table. ID is required by jqGrid.\n toolbarContainer.attr('id', toolbarContainerId);\n\n $scope.$watch('options.selectedColumnIds', function (newValue) {\n var columnChangedData;\n\n /*istanbul ignore else: sanity check */\n if (newValue) {\n if (reorderingColumns) {\n reorderingColumns = false;\n return;\n }\n\n initGrid();\n\n // re-evaluated so the grid won't automatically be reloaded with existing data.\n columnChangedData = {\n willResetData: false\n };\n\n $scope.$emit('includedColumnsChanged', columnChangedData);\n\n\n if (!columnChangedData.willResetData && $scope.options.data && $scope.options.data.length > 0) {\n // Data won't change as a result of the columns changing; reload existing data.\n setRows($scope.options.data);\n }\n }\n }, true);\n\n $scope.$watchCollection('selectedRows', function (newSelections) {\n var i,\n index,\n rowIds;\n\n if (localRowSelect) {\n localRowSelect = false;\n return;\n }\n\n if (tableEl[0].grid && $scope.options.data && $scope.options.data.length > 0) {\n //blow away existing selections\n tableEl.resetSelection();\n\n rowIds = tableEl.getDataIDs();\n\n for (i = 0; i < newSelections.length; i++) {\n\n index = arrayObjectIndexOf($scope.options.data, newSelections[i]);\n\n if (index > -1) {\n tableEl.setSelection(rowIds[index], false);\n }\n\n }\n }\n\n });\n\n $scope.$watch('paginationOptions', initializePagination, true);\n\n $scope.$watchCollection('options.data', function (newValue) {\n if (doNotResetRows) {\n doNotResetRows = false;\n } else {\n setRows(newValue);\n }\n });\n\n $scope.syncViewKeepers = function () {\n /*istanbul ignore else: sanity check */\n if (vkToolbars) {\n vkToolbars.syncElPosition();\n }\n };\n\n $scope.syncActionBarViewKeeper = function () {\n /*istanbul ignore else: sanity check */\n if (vkActionBarAndBackToTop) {\n vkActionBarAndBackToTop.syncElPosition();\n }\n };\n\n $scope.$watch('options.sortOptions', setSortStyles, true);\n\n $scope.$watchGroup(['options.viewKeeperOffsetElId', 'options.fixedToolbar'], function () {\n setupToolbarViewKeepers();\n });\n\n $scope.$watch('options.filters', function (f) {\n $scope.$broadcast('updateAppliedFilters', f);\n });\n\n $scope.$on(\"reInitGrid\", function () {\n reInitGrid();\n });\n\n bbMediaBreakpoints.register(mediaBreakpointHandler);\n\n tableWrapper.on('scroll', function () {\n\n /*istanbul ignore else: sanity check */\n if (vkHeader) {\n vkHeader.syncElPosition();\n }\n\n if (header.hasClass('bb-viewkeeper-fixed')) {\n header.scrollLeft(tableWrapper.scrollLeft());\n }\n\n getTopScrollbar().scrollLeft(tableWrapper.scrollLeft());\n });\n\n windowEventId = 'bbgrid' + id;\n\n windowEl.on('resize.' + windowEventId + ', orientationchange.' + windowEventId, function () {\n handleTableWrapperResize();\n });\n\n // Reinitialize grid when grid element resizes from 0\n $scope.$watch(function () {\n return element.width();\n }, function (newValue, oldValue) {\n if (newValue !== oldValue && oldValue === 0) {\n reInitGrid();\n }\n });\n\n $scope.locals.topScrollbarScroll = function () {\n var topScrollbar = getTopScrollbar();\n tableWrapper.scrollLeft(topScrollbar.scrollLeft());\n if (header.hasClass('bb-viewkeeper-fixed')) {\n header.scrollLeft(topScrollbar.scrollLeft());\n }\n };\n\n $scope.locals.hasWaitAndEmpty = function () {\n return $scope.options && $scope.options.loading && (!$scope.options.data || $scope.options.data.length < 1);\n };\n\n\n element.on('$destroy', function () {\n\n /*istanbul ignore else: sanity check */\n if (vkToolbars) {\n vkToolbars.destroy();\n }\n\n /*istanbul ignore else: sanity check */\n if (vkHeader) {\n vkHeader.destroy();\n }\n\n /*istanbul ignore else: sanity check */\n if (vkActionBarAndBackToTop) {\n vkActionBarAndBackToTop.destroy();\n }\n\n windowEl.off('resize.' + windowEventId + ', orientationchange.' + windowEventId);\n\n fancyCheckOff();\n\n bbMediaBreakpoints.unregister(mediaBreakpointHandler);\n });\n });\n },\n templateUrl: 'sky/templates/grids/grid.html'\n };\n }]);\n}(jQuery));\n", "/*global angular */\n\n(function () {\n 'use strict';\n\n\n function BBGridToolbar(bbResources, bbModal) {\n return {\n require: '?^bbGrid',\n scope: {\n options: '=?bbToolbarOptions'\n },\n transclude: true,\n link: function ($scope, el, attr, bbGrid) {\n var topScrollbarEl = el.find('.bb-grid-top-scrollbar');\n\n function applySearchText() {\n var searchEl;\n\n searchEl = el.find('.bb-search-container input');\n /*istanbul ignore else: sanity check */\n if (angular.isFunction(searchEl.select) && searchEl.length > 0 && $scope.searchText) {\n searchEl.eq(0).select();\n }\n\n $scope.options.searchText = $scope.searchText;\n\n /*istanbul ignore else: sanity check */\n if (bbGrid !== null) {\n bbGrid.highlightSearchText();\n }\n }\n\n function openColumnPicker() {\n bbModal.open({\n templateUrl: 'sky/templates/grids/columnpicker.html',\n controller: 'BBGridColumnPickerController',\n resolve: {\n columns: function () {\n return $scope.options.columns;\n },\n selectedColumnIds: function () {\n return $scope.options.selectedColumnIds;\n },\n columnPickerHelpKey: function () {\n return $scope.options.columnPickerHelpKey;\n },\n subsetLabel: function () {\n return $scope.options.columnPickerSubsetLabel;\n },\n subsetProperty: function () {\n return $scope.options.columnPickerSubsetProperty;\n },\n subsetExclude: function () {\n return $scope.options.columnPickerSubsetExclude;\n },\n onlySelected: function () {\n return $scope.options.columnPickerOnlySelected;\n }\n }\n }).result.then(function (selectedColumnIds) {\n $scope.options.selectedColumnIds = selectedColumnIds;\n });\n }\n\n function toggleFilterMenu(isOpen) {\n if ($scope.options && $scope.options.hasInlineFilters) {\n if (angular.isDefined(isOpen)) {\n $scope.toolbarLocals.filtersVisible = isOpen;\n } else {\n $scope.toolbarLocals.filtersVisible = !$scope.toolbarLocals.filtersVisible;\n }\n /*istanbul ignore else: sanity check */\n } else if (bbGrid !== null && angular.isFunction(bbGrid.toggleFilterMenu)) {\n bbGrid.toggleFilterMenu(isOpen);\n }\n }\n\n function moveInlineFilters() {\n el.parents('.bb-grid-container').find('.bb-filters-inline')\n .appendTo(el.find('.bb-grid-filter-inline-container'));\n\n }\n\n $scope.toolbarLocals = {\n applySearchText: applySearchText,\n openColumnPicker: openColumnPicker,\n toggleFilterMenu: toggleFilterMenu\n };\n\n $scope.resources = bbResources;\n\n /*istanbul ignore else: sanity check */\n if (bbGrid !== null && angular.isUndefined($scope.options)) {\n $scope.$watch(function () {\n return bbGrid.scope.options;\n }, function (newValue) {\n $scope.options = newValue;\n });\n }\n\n //grid columns changed, initialize toolbar stuff\n $scope.$watch('options.selectedColumnIds', function (newValue) {\n if (angular.isDefined(newValue)) {\n\n $scope.searchText = $scope.options.searchText;\n\n if ($scope.options.hasInlineFilters) {\n moveInlineFilters();\n }\n\n /*istanbul ignore else: sanity check */\n if (bbGrid !== null) {\n bbGrid.applySearchText = applySearchText;\n }\n\n if (angular.isFunction($scope.options.onAddClick)) {\n $scope.toolbarLocals.hasAdd = true;\n }\n }\n }, true);\n\n $scope.$watch('options.searchText', function (newValue) {\n if (newValue !== $scope.searchText) {\n $scope.searchText = newValue;\n }\n });\n\n $scope.$watch('options.filtersOpen', function (newValue) {\n if (angular.isDefined(newValue)) {\n toggleFilterMenu(newValue);\n }\n });\n\n /*istanbul ignore else: sanity check */\n if (bbGrid !== null) {\n topScrollbarEl.on('scroll', function () {\n bbGrid.syncGridHeaderScrollToTopScrollbar();\n });\n }\n\n $scope.$on('$destroy', function () {\n /*istanbul ignore else: sanity check */\n if (bbGrid !== null) {\n topScrollbarEl.off();\n }\n });\n\n\n },\n templateUrl: 'sky/templates/grids/gridtoolbar.html'\n };\n }\n\n BBGridToolbar.$inject = ['bbResources', 'bbModal'];\n\n angular.module('sky.grids.toolbar', ['sky.resources', 'sky.modal', 'sky.grids.columnpicker'])\n .directive('bbGridToolbar', BBGridToolbar);\n}());\n", "/*jslint browser: true, plusplus: true */\n/*global angular, jQuery */\n\n(function () {\n 'use strict';\n\n angular.module('sky.help', ['ui.router'])\n .constant('bbHelpConfig', {\n onHelpLoaded: null,\n productId: 'Sky',\n customLocales: [],\n url: null\n })\n .factory('bbHelp', ['$q', '$state', '$window', 'bbHelpConfig', function ($q, $state, $window, bbHelpConfig) {\n var initPromise;\n\n function helpwidgetLoaded() {\n return !!($window.BBHELP && $window.BBHELP.HelpWidget);\n }\n\n function init() {\n var configOnHelpLoaded,\n deferred;\n\n if (!initPromise) {\n deferred = $q.defer();\n initPromise = deferred.promise;\n\n if (helpwidgetLoaded()) {\n deferred.resolve();\n } else if (bbHelpConfig.url) {\n jQuery.ajax({\n cache: true,\n dataType: 'script',\n url: bbHelpConfig.url\n }).done(function () {\n var config = angular.extend({}, bbHelpConfig);\n\n if (!config.getCurrentHelpKey) {\n config.getCurrentHelpKey = function () {\n // $state.current.helpKeyOverride outranks $state.current.pageData.helpKey\n if ($state.current.helpKeyOverride) {\n return $state.current.helpKeyOverride;\n }\n\n if ($state.current.pageData) {\n return $state.current.pageData.helpKey;\n }\n return null;\n };\n }\n\n configOnHelpLoaded = config.onHelpLoaded;\n\n config.onHelpLoaded = function () {\n if (angular.isFunction(configOnHelpLoaded)) {\n configOnHelpLoaded.apply(this, arguments);\n }\n\n deferred.resolve();\n };\n\n $window.BBHELP.HelpWidget.load(config);\n });\n } else {\n initPromise = null;\n throw new Error('bbHelpConfig.url is not defined.');\n }\n }\n\n return initPromise;\n }\n\n function open() {\n var args = arguments;\n\n init().then(function () {\n $window.BBHELP.HelpWidget.open.apply($window.BBHELP.HelpWidget, args);\n });\n }\n\n function close() {\n if (helpwidgetLoaded()) {\n $window.BBHELP.HelpWidget.close.apply($window.BBHELP.HelpWidget, arguments);\n }\n }\n\n return {\n init: init,\n open: open,\n close: close\n };\n }]);\n\n}());\n", "/*jslint browser: true, plusplus: true */\n/*global angular */\n\n(function () {\n 'use strict';\n\n angular.module('sky.helpbutton', ['sky.help'])\n .directive('bbHelpButton', ['$state', '$window', 'bbHelp', function ($state, $window, bbHelp) {\n ///